UNPKG

3.57 kBJavaScriptView Raw
1var assert = require("assert")
2var resolve = require("path").resolve
3var url = require("url")
4
5var log = require("npmlog")
6var readPackageJson = require("read-package-json")
7
8var mapToRegistry = require("./utils/map-to-registry.js")
9var npa = require("npm-package-arg")
10var npm = require("./npm.js")
11
12module.exports = access
13
14access.usage = "npm access public [<package>]"
15 + "\nnpm access restricted [<package>]"
16 + "\nnpm access add <read-only|read-write> <entity> [<package>]"
17 + "\nnpm access rm <entity> [<package>]"
18 + "\nnpm access ls [<package>]"
19 + "\nnpm access edit [<package>]"
20
21access.completion = function (opts, cb) {
22 var argv = opts.conf.argv.remain
23 if (argv.length === 2) {
24 return cb(null, ["public", "restricted", "add", "rm", "ls", "edit"])
25 }
26
27 switch (argv[2]) {
28 case "public":
29 case "restricted":
30 case "ls":
31 case "edit":
32 return cb(new Error("unimplemented: packages you can change"))
33 case "add":
34 if (argv.length === 3) return cb(null, ["read-only", "read-write"])
35
36 return cb(new Error("unimplemented: entities and packages"))
37 case "rm":
38 return cb(new Error("unimplemented: entities and packages"))
39 default:
40 return cb(new Error(argv[2]+" not recognized"))
41 }
42}
43
44function access (args, cb) {
45 var cmd = args.shift()
46 switch (cmd) {
47 case "public": case "restricted": return changeAccess(args, cmd, cb)
48 case "add": case "set": return add(args, cb)
49 case "rm": case "del": case "clear": return rm(args, cb)
50 case "list": case "sl": case "ls": return ls(args, cb)
51 case "edit": case "ed": return edit(args, cb)
52 default: return cb("Usage:\n"+access.usage)
53 }
54}
55
56function changeAccess (args, level, cb) {
57 assert(Array.isArray(args), "changeAccess requires args be an array")
58 assert(
59 ["public", "restricted"].indexOf(level) !== -1,
60 "access level must be either 'public' or 'restricted'"
61 )
62 assert(typeof cb === "function", "changeAccess requires a callback")
63
64 var p = (args.shift() || "").trim()
65 if (!p) return getCurrentPackage(level, cb)
66 changeAccess_(p, level, cb)
67}
68
69function getCurrentPackage (level, cb) {
70 var here = resolve(npm.prefix, "package.json")
71 log.verbose("setPackageLevel", "here", here)
72
73 readPackageJson(here, function (er, data) {
74 if (er) return cb(er)
75
76 if (!data.name) {
77 return cb(new Error("Package must be named"))
78 }
79
80 changeAccess_(data.name, level, cb)
81 })
82}
83
84function changeAccess_ (name, level, cb) {
85 log.verbose("changeAccess", "name", name, "level", level)
86 mapToRegistry(name, npm.config, function (er, uri, auth, base) {
87 if (er) return cb(er)
88
89 var data = npa(name)
90 if (!data.scope) {
91 var msg = "Sorry, you can't change the access level of unscoped packages."
92 log.error("access", msg)
93 return cb(new Error(msg))
94 }
95
96 // name must be scoped, so escape separator
97 name = name.replace("/", "%2f")
98 // FIXME: mapToRegistry still isn't generic enough SIGH
99 uri = url.resolve(base, "-/package/"+name+"/access")
100 var params = {
101 level : level,
102 auth : auth
103 }
104
105 npm.registry.access(uri, params, cb)
106 })
107}
108
109function add (args, cb) {
110 return cb(new Error("npm access add isn't implemented yet!"))
111}
112
113function rm (args, cb) {
114 return cb(new Error("npm access rm isn't implemented yet!"))
115}
116
117function ls (args, cb) {
118 return cb(new Error("npm access ls isn't implemented yet!"))
119}
120
121function edit (args, cb) {
122 return cb(new Error("npm edit ls isn't implemented yet!"))
123}