UNPKG

8.57 kBJavaScriptView Raw
1
2module.exports = config
3
4config.usage = "npm config set <key> <value>"
5 + "\nnpm config get [<key>]"
6 + "\nnpm config delete <key>"
7 + "\nnpm config list"
8 + "\nnpm config edit"
9 + "\nnpm set <key> <value>"
10 + "\nnpm get [<key>]"
11
12var log = require("npmlog")
13 , npm = require("./npm.js")
14 , npmconf = require("./config/core.js")
15 , fs = require("graceful-fs")
16 , writeFileAtomic = require("write-file-atomic")
17 , types = npmconf.defs.types
18 , ini = require("ini")
19 , editor = require("editor")
20 , os = require("os")
21
22config.completion = function (opts, cb) {
23 var argv = opts.conf.argv.remain
24 if (argv[1] !== "config") argv.unshift("config")
25 if (argv.length === 2) {
26 var cmds = ["get", "set", "delete", "ls", "rm", "edit"]
27 if (opts.partialWord !== "l") cmds.push("list")
28 return cb(null, cmds)
29 }
30
31 var action = argv[2]
32 switch (action) {
33 case "set":
34 // todo: complete with valid values, if possible.
35 if (argv.length > 3) return cb(null, [])
36 // fallthrough
37 case "get":
38 case "delete":
39 case "rm":
40 return cb(null, Object.keys(types))
41 case "edit":
42 case "list": case "ls":
43 return cb(null, [])
44 default: return cb(null, [])
45 }
46}
47
48// npm config set key value
49// npm config get key
50// npm config list
51function config (args, cb) {
52 var action = args.shift()
53 switch (action) {
54 case "set": return set(args[0], args[1], cb)
55 case "get": return get(args[0], cb)
56 case "delete": case "rm": case "del": return del(args[0], cb)
57 case "list": case "ls": return list(cb)
58 case "edit": return edit(cb)
59 default: return unknown(action, cb)
60 }
61}
62
63function edit (cb) {
64 var e = npm.config.get("editor")
65 , which = npm.config.get("global") ? "global" : "user"
66 , f = npm.config.get(which + "config")
67 if (!e) return cb(new Error("No EDITOR config or environ set."))
68 npm.config.save(which, function (er) {
69 if (er) return cb(er)
70 fs.readFile(f, "utf8", function (er, data) {
71 if (er) data = ""
72 data = [ ";;;;"
73 , "; npm "+(npm.config.get("global") ?
74 "globalconfig" : "userconfig")+" file"
75 , "; this is a simple ini-formatted file"
76 , "; lines that start with semi-colons are comments."
77 , "; read `npm help config` for help on the various options"
78 , ";;;;"
79 , ""
80 , data
81 ].concat( [ ";;;;"
82 , "; all options with default values"
83 , ";;;;"
84 ]
85 )
86 .concat(Object.keys(npmconf.defaults).reduce(function (arr, key) {
87 var obj = {};
88 obj[key] = npmconf.defaults[key]
89 if (key === "logstream") return arr
90 return arr.concat(
91 ini.stringify(obj)
92 .replace(/\n$/m, "")
93 .replace(/^/g, "; ")
94 .replace(/\n/g, "\n; ")
95 .split("\n"))
96 }, []))
97 .concat([""])
98 .join(os.EOL)
99 writeFileAtomic
100 ( f
101 , data
102 , function (er) {
103 if (er) return cb(er)
104 editor(f, { editor: e }, cb)
105 }
106 )
107 })
108 })
109}
110
111function del (key, cb) {
112 if (!key) return cb(new Error("no key provided"))
113 var where = npm.config.get("global") ? "global" : "user"
114 npm.config.del(key, (where === 'user' && npm.config.get('registry', 'cli')) ? 'user-reg' : where)
115 npm.config.save(where, cb)
116}
117
118function set (key, val, cb) {
119 if (key === undefined) {
120 return unknown("", cb)
121 }
122 if (val === undefined) {
123 if (key.indexOf("=") !== -1) {
124 var k = key.split("=")
125 key = k.shift()
126 val = k.join("=")
127 } else {
128 val = ""
129 }
130 }
131 key = key.trim()
132 val = val.trim()
133 log.info("config", "set %j %j", key, val)
134 var where = npm.config.get("global") ? "global" : "user"
135 npm.config.set(key, val, (where === 'user' && npm.config.get('registry', 'cli')) ? 'user-reg' : where)
136 npm.config.save(where, cb)
137}
138
139function get (key, cb) {
140 if (!key) return list(cb)
141 if (key.charAt(0) === "_" || key === 'registries') {
142 return cb(new Error("---sekretz---"))
143 }
144 console.log(npm.config.get(key))
145 cb()
146}
147
148function sort (a, b) {
149 return a > b ? 1 : -1
150}
151
152function public (k) {
153 return !(k.charAt(0) === "_" || types[k] !== types[k] || k === 'registries')
154}
155
156function getKeys (data) {
157 return Object.keys(data).filter(public).sort(sort)
158}
159
160function list (cb) {
161 var msg = ""
162 , long = npm.config.get("long")
163
164 var cli = npm.config.sources.cli.data
165 , cliKeys = getKeys(cli)
166 if (cliKeys.length) {
167 msg += "; cli configs\n"
168 cliKeys.forEach(function (k) {
169 if (cli[k] && typeof cli[k] === "object") return
170 if (k === "argv") return
171 msg += k + " = " + JSON.stringify(cli[k]) + "\n"
172 })
173 msg += "\n"
174 }
175
176 // env configs
177 var env = npm.config.sources.env.data
178 , envKeys = getKeys(env)
179 if (envKeys.length) {
180 msg += "; environment configs\n"
181 envKeys.forEach(function (k) {
182 if (env[k] !== npm.config.get(k)) {
183 if (!long) return
184 msg += "; " + k + " = " + JSON.stringify(env[k])
185 + " (overridden)\n"
186 } else msg += k + " = " + JSON.stringify(env[k]) + "\n"
187 })
188 msg += "\n"
189 }
190
191 // registry overrides
192 var uconf = npm.config.sources['user-reg'].data
193 , uconfKeys = getKeys(uconf)
194 if (uconfKeys.length) {
195 msg += "; userconfig.registry " + npm.config.get('registry') + "\n"
196 uconfKeys.forEach(function (k) {
197 var val = (k.charAt(0) === "_")
198 ? "---sekretz---"
199 : JSON.stringify(uconf[k])
200 if (uconf[k] !== npm.config.get(k)) {
201 if (!long) return
202 msg += "; " + k + " = " + val
203 + " (overridden)\n"
204 } else msg += k + " = " + val + "\n"
205 })
206 msg += "\n"
207 }
208
209 // user config file
210 var uconf = npm.config.sources.user.data
211 , uconfKeys = getKeys(uconf)
212 if (uconfKeys.length) {
213 msg += "; userconfig " + npm.config.get("userconfig") + "\n"
214 uconfKeys.forEach(function (k) {
215 var val = (k.charAt(0) === "_")
216 ? "---sekretz---"
217 : JSON.stringify(uconf[k])
218 if (uconf[k] !== npm.config.get(k)) {
219 if (!long) return
220 msg += "; " + k + " = " + val
221 + " (overridden)\n"
222 } else msg += k + " = " + val + "\n"
223 })
224 msg += "\n"
225 }
226
227 // global config file
228 var gconf = npm.config.sources.global.data
229 , gconfKeys = getKeys(gconf)
230 if (gconfKeys.length) {
231 msg += "; globalconfig " + npm.config.get("globalconfig") + "\n"
232 gconfKeys.forEach(function (k) {
233 var val = (k.charAt(0) === "_")
234 ? "---sekretz---"
235 : JSON.stringify(gconf[k])
236 if (gconf[k] !== npm.config.get(k)) {
237 if (!long) return
238 msg += "; " + k + " = " + val
239 + " (overridden)\n"
240 } else msg += k + " = " + val + "\n"
241 })
242 msg += "\n"
243 }
244
245 // builtin config file
246 var builtin = npm.config.sources.builtin || {}
247 if (builtin && builtin.data) {
248 var bconf = builtin.data
249 , bpath = builtin.path
250 , bconfKeys = getKeys(bconf)
251 if (bconfKeys.length) {
252 msg += "; builtin config " + bpath + "\n"
253 bconfKeys.forEach(function (k) {
254 var val = (k.charAt(0) === "_")
255 ? "---sekretz---"
256 : JSON.stringify(bconf[k])
257 if (bconf[k] !== npm.config.get(k)) {
258 if (!long) return
259 msg += "; " + k + " = " + val
260 + " (overridden)\n"
261 } else msg += k + " = " + val + "\n"
262 })
263 msg += "\n"
264 }
265 }
266
267 // only show defaults if --long
268 if (!long) {
269 msg += "; node bin location = " + process.execPath + "\n"
270 + "; cwd = " + process.cwd() + "\n"
271 + "; HOME = " + process.env.HOME + "\n"
272 + "; 'npm config ls -l' to show all defaults.\n"
273
274 console.log(msg)
275 return cb()
276 }
277
278 var defaults = npmconf.defaults
279 , defKeys = getKeys(defaults)
280 msg += "; default values\n"
281 defKeys.forEach(function (k) {
282 if (defaults[k] && typeof defaults[k] === "object") return
283 var val = JSON.stringify(defaults[k])
284 if (defaults[k] !== npm.config.get(k)) {
285 msg += "; " + k + " = " + val
286 + " (overridden)\n"
287 } else msg += k + " = " + val + "\n"
288 })
289 msg += "\n"
290
291 console.log(msg)
292 return cb()
293}
294
295function unknown (action, cb) {
296 cb("Usage:\n" + config.usage)
297}