1 | var assert = require("assert")
|
2 | var resolve = require("path").resolve
|
3 | var url = require("url")
|
4 |
|
5 | var log = require("npmlog")
|
6 | var readPackageJson = require("read-package-json")
|
7 |
|
8 | var mapToRegistry = require("./utils/map-to-registry.js")
|
9 | var npa = require("npm-package-arg")
|
10 | var npm = require("./npm.js")
|
11 |
|
12 | module.exports = access
|
13 |
|
14 | access.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 |
|
21 | access.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 |
|
44 | function 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 |
|
56 | function 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 |
|
69 | function 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 |
|
84 | function 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 |
|
97 | name = name.replace("/", "%2f")
|
98 |
|
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 |
|
109 | function add (args, cb) {
|
110 | return cb(new Error("npm access add isn't implemented yet!"))
|
111 | }
|
112 |
|
113 | function rm (args, cb) {
|
114 | return cb(new Error("npm access rm isn't implemented yet!"))
|
115 | }
|
116 |
|
117 | function ls (args, cb) {
|
118 | return cb(new Error("npm access ls isn't implemented yet!"))
|
119 | }
|
120 |
|
121 | function edit (args, cb) {
|
122 | return cb(new Error("npm edit ls isn't implemented yet!"))
|
123 | }
|