2 module.exports = config
4 config.usage = "npm config set <key> <value>"
5 + "\nnpm config get [<key>]"
6 + "\nnpm config delete <key>"
9 + "\nnpm set <key> <value>"
12 var ini = require("./utils/ini.js")
13 , log = require("npmlog")
14 , npm = require("./npm.js")
15 , exec = require("./utils/exec.js")
16 , fs = require("graceful-fs")
18 , output = require("./utils/output.js")
19 , types = require("./utils/config-defs.js").types
21 config.completion = function (opts, cb) {
22 var argv = opts.conf.argv.remain
23 if (argv[1] !== "config") argv.unshift("config")
24 if (argv.length === 2) {
25 var cmds = ["get", "set", "delete", "ls", "rm", "edit"]
26 if (opts.partialWord !== "l") cmds.push("list")
33 // todo: complete with valid values, if possible.
34 if (argv.length > 3) return cb(null, [])
39 return cb(null, Object.keys(types))
41 case "list": case "ls":
43 default: return cb(null, [])
47 // npm config set key value
50 function config (args, cb) {
51 var action = args.shift()
53 case "set": return set(args[0], args[1], cb)
54 case "get": return get(args[0], cb)
55 case "delete": case "rm": case "del": return del(args[0], cb)
56 case "list": case "ls": return list(cb)
57 case "edit": return edit(cb)
58 default: return unknown(action, cb)
63 var e = ini.get("editor")
64 , which = ini.get("global") ? "global" : "user"
65 , f = ini.get(which + "config")
66 , eol = process.platform === "win32" ? "\r\n" : "\n"
67 if (!e) return cb(new Error("No EDITOR config or environ set."))
68 ini.save(which, function (er) {
70 fs.readFile(f, "utf8", function (er, data) {
72 dc = dc || require("./utils/config-defs.js").defaults
74 , "; npm "+(ini.get("global") ?
75 "globalconfig" : "userconfig")+" file"
76 , "; this is a simple ini-formatted file"
77 , "; lines that start with semi-colons are comments."
78 , "; read `npm help config` for help on the various options"
83 , "; all options with default values"
87 .concat(Object.keys(dc).map(function (k) {
88 return "; " + k + " = " + ini.unParseField(dc[k],k)
98 exec(e, [f], function (er) {
100 ini.resolveConfigs(function (er) {
101 if (er) return cb(er)
111 function del (key, cb) {
112 if (!key) return cb(new Error("no key provided"))
114 ini.save(ini.get("global") ? "global" : "user", cb)
117 function set (key, val, cb) {
118 if (key === undefined) {
119 return unknown("", cb)
121 if (val === undefined) {
122 if (key.indexOf("=") !== -1) {
123 var k = key.split("=")
132 log.info("config", "set %j %j", key, val)
133 var where = ini.get("global") ? "global" : "user"
134 ini.set(key, val, where)
138 function get (key, cb) {
139 if (!key) return list(cb)
140 if (key.charAt(0) === "_") {
141 return cb(new Error("---sekretz---"))
143 output.write(npm.config.get(key), cb)
146 function sort (a, b) {
147 return a > b ? 1 : -1
150 function reverse (a, b) {
151 return a > b ? -1 : 1
156 , long = npm.config.get("long")
159 // show any that aren't secret
160 var cli = ini.configList.list[ini.TRANS.cli]
161 , eol = process.platform === "win32" ? "\r\n" : "\n"
162 , cliKeys = Object.keys(cli).filter(function (k) {
163 return !(k.charAt(0) === "_" || types[k] !== types[k])
164 }).sort(function (a, b) {
165 return a > b ? 1 : -1
167 if (cliKeys.length) {
168 msg += "; cli configs" + eol
169 cliKeys.forEach(function (k) {
170 if (k === "argv") return
171 msg += k + " = " + JSON.stringify(cli[k]) + eol
177 var env = ini.configList.list[ini.TRANS.env]
178 , envKeys = Object.keys(env).filter(function (k) {
179 return !(k.charAt(0) === "_" || types[k] !== types[k])
180 }).sort(function (a, b) {
181 return a > b ? 1 : -1
183 if (envKeys.length) {
184 msg += "; environment configs" + eol
185 envKeys.forEach(function (k) {
186 if (env[k] !== ini.get(k)) {
188 msg += "; " + k + " = " + JSON.stringify(env[k])
189 + " (overridden)" + eol
190 } else msg += k + " = " + JSON.stringify(env[k]) + eol
196 var uconf = ini.configList.list[ini.TRANS.user]
197 , uconfKeys = Object.keys(uconf).filter(function (k) {
198 return types[k] === types[k]
199 }).sort(function (a, b) {
200 return a > b ? 1 : -1
202 if (uconfKeys.length) {
203 msg += "; userconfig " + ini.get("userconfig") + eol
204 uconfKeys.forEach(function (k) {
205 var val = (k.charAt(0) === "_")
207 : JSON.stringify(uconf[k])
208 if (uconf[k] !== ini.get(k)) {
210 msg += "; " + k + " = " + val
211 + " (overridden)" + eol
212 } else msg += k + " = " + val + eol
217 // global config file
218 var gconf = ini.configList.list[ini.TRANS.global]
219 , gconfKeys = Object.keys(gconf).filter(function (k) {
220 return types[k] === types[k]
221 }).sort(function (a, b) {
222 return a > b ? 1 : -1
224 if (gconfKeys.length) {
225 msg += "; globalconfig " + ini.get("globalconfig") + eol
226 gconfKeys.forEach(function (k) {
227 var val = (k.charAt(0) === "_")
229 : JSON.stringify(gconf[k])
230 if (gconf[k] !== ini.get(k)) {
232 msg += "; " + k + " = " + val
233 + " (overridden)" + eol
234 } else msg += k + " = " + val + eol
239 // builtin config file
240 var bconf = ini.configList.list[ini.TRANS.builtin]
241 , bconfKeys = Object.keys(bconf).filter(function (k) {
242 return types[k] === types[k]
243 }).sort(function (a, b) {
244 return a > b ? 1 : -1
246 if (bconfKeys.length) {
247 var path = require("path")
248 msg += "; builtin config " + path.resolve(__dirname, "../npmrc") + eol
249 bconfKeys.forEach(function (k) {
250 var val = (k.charAt(0) === "_")
252 : JSON.stringify(bconf[k])
253 if (bconf[k] !== ini.get(k)) {
255 msg += "; " + k + " = " + val
256 + " (overridden)" + eol
257 } else msg += k + " = " + val + eol
262 // only show defaults if --long
264 msg += "; node install prefix = " + process.installPrefix + eol
265 + "; node bin location = " + process.execPath + eol
266 + "; cwd = " + process.cwd() + eol
267 + "; HOME = " + process.env.HOME + eol
268 + "; 'npm config ls -l' to show all defaults." + eol
270 return output.write(msg, cb)
273 var defaults = ini.defaultConfig
274 , defKeys = Object.keys(defaults)
275 msg += "; default values" + eol
276 defKeys.forEach(function (k) {
277 var val = JSON.stringify(defaults[k])
278 if (defaults[k] !== ini.get(k)) {
280 msg += "; " + k + " = " + val
281 + " (overridden)" + eol
282 } else msg += k + " = " + val + eol
286 return output.write(msg, cb)
289 function unknown (action, cb) {
290 cb("Usage:\n" + config.usage)