1 // defaults, types, and shorthands.
4 var path = require("path")
6 , Stream = require("stream").Stream
7 , semver = require("semver")
8 , stableFamily = semver.parse(process.version)
9 , nopt = require("nopt")
10 , log = require("npmlog")
11 , npm = require("../npm.js")
12 , osenv = require("osenv")
15 function validateOctal (data, k, val) {
16 // must be either an integer or an octal string.
17 if (typeof val === "number") {
18 data[k] = "0" + val.toString(8)
20 if (typeof val === "string") {
21 if (val.charAt(0) !== "0" || isNaN(val)) return false
22 data[k] = "0" + parseInt(val, 8).toString(8)
26 function validateSemver (data, k, val) {
27 if (!semver.valid(val)) return false
28 data[k] = semver.valid(val)
31 function validateStream (data, k, val) {
32 if (!(val instanceof Stream)) return false
36 nopt.typeDefs.semver = { type: semver, validate: validateSemver }
37 nopt.typeDefs.Octal = { type: Octal, validate: validateOctal }
38 nopt.typeDefs.Stream = { type: Stream, validate: validateStream }
40 nopt.invalidHandler = function (k, val, type, data) {
41 log.warn("invalid config", k + "=" + JSON.stringify(val))
43 if (Array.isArray(type)) {
44 if (type.indexOf(url) !== -1) type = url
45 else if (type.indexOf(path) !== -1) type = path
50 log.warn("invalid config", "Must be octal number, starting with 0")
53 log.warn("invalid config", "Must be a full url with 'http://'")
56 log.warn("invalid config", "Must be a valid filesystem path")
59 log.warn("invalid config", "Must be a numeric value")
62 log.warn("invalid config", "Must be an instance of the Stream class")
67 if (!stableFamily || (+stableFamily[2] % 2)) stableFamily = null
68 else stableFamily = stableFamily[1] + "." + stableFamily[2]
72 var temp = osenv.tmpdir()
73 var home = osenv.home()
75 if (home) process.env.HOME = home
79 Object.defineProperty(exports, "defaults", {get: function () {
80 if (defaults) return defaults
82 if (process.env.PREFIX) {
83 globalPrefix = process.env.PREFIX
84 } else if (process.platform === "win32") {
85 // c:\node\node.exe --> prefix=c:\node\
86 globalPrefix = path.dirname(process.execPath)
88 // /usr/local/bin/node --> prefix=/usr/local
89 globalPrefix = path.dirname(path.dirname(process.execPath))
91 // destdir only is respected on Unix
92 if (process.env.DESTDIR) {
93 globalPrefix = path.join(process.env.DESTDIR, globalPrefix)
98 { "always-auth" : false
101 , browser : process.platform === "darwin" ? "open"
102 : process.platform === "win32" ? "start"
105 , ca : // the npm CA certificate.
106 "-----BEGIN CERTIFICATE-----\n"+
107 "MIIChzCCAfACCQDauvz/KHp8ejANBgkqhkiG9w0BAQUFADCBhzELMAkGA1UEBhMC\n"+
108 "VVMxCzAJBgNVBAgTAkNBMRAwDgYDVQQHEwdPYWtsYW5kMQwwCgYDVQQKEwNucG0x\n"+
109 "IjAgBgNVBAsTGW5wbSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxDjAMBgNVBAMTBW5w\n"+
110 "bUNBMRcwFQYJKoZIhvcNAQkBFghpQGl6cy5tZTAeFw0xMTA5MDUwMTQ3MTdaFw0y\n"+
111 "MTA5MDIwMTQ3MTdaMIGHMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExEDAOBgNV\n"+
112 "BAcTB09ha2xhbmQxDDAKBgNVBAoTA25wbTEiMCAGA1UECxMZbnBtIENlcnRpZmlj\n"+
113 "YXRlIEF1dGhvcml0eTEOMAwGA1UEAxMFbnBtQ0ExFzAVBgkqhkiG9w0BCQEWCGlA\n"+
114 "aXpzLm1lMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDLI4tIqPpRW+ACw9GE\n"+
115 "OgBlJZwK5f8nnKCLK629Pv5yJpQKs3DENExAyOgDcyaF0HD0zk8zTp+ZsLaNdKOz\n"+
116 "Gn2U181KGprGKAXP6DU6ByOJDWmTlY6+Ad1laYT0m64fERSpHw/hjD3D+iX4aMOl\n"+
117 "y0HdbT5m1ZGh6SJz3ZqxavhHLQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAC4ySDbC\n"+
118 "l7W1WpLmtLGEQ/yuMLUf6Jy/vr+CRp4h+UzL+IQpCv8FfxsYE7dhf/bmWTEupBkv\n"+
119 "yNL18lipt2jSvR3v6oAHAReotvdjqhxddpe5Holns6EQd1/xEZ7sB1YhQKJtvUrl\n"+
120 "ZNufy1Jf1r0ldEGeA+0ISck7s+xSh9rQD2Op\n"+
121 "-----END CERTIFICATE-----\n"
123 , cache : process.platform === "win32"
124 ? path.resolve(process.env.APPDATA || home || temp, "npm-cache")
125 : path.resolve( home || temp, ".npm")
127 , "cache-lock-stale": 60000
128 , "cache-lock-retries": 10
129 , "cache-lock-wait": 10000
131 , "cache-max": Infinity
139 , editor : osenv.editor()
140 , "engine-strict": false
144 , "fetch-retry-factor": 10
145 , "fetch-retry-mintimeout": 10000
146 , "fetch-retry-maxtimeout": 60000
151 , globalconfig : path.resolve(globalPrefix, "etc", "npmrc")
152 , globalignorefile : path.resolve( globalPrefix, "etc", "npmignore")
153 , group : process.platform === "win32" ? 0
154 : process.env.SUDO_GID || (process.getgid && process.getgid())
156 , "init-module": path.resolve(home, '.npm-init.js')
157 , "init.version" : "0.0.0"
158 , "init.author.name" : ""
159 , "init.author.email" : ""
160 , "init.author.url" : ""
164 , logstream : process.stderr
167 , "node-version" : process.version
168 , npaturl : "http://npat.npmjs.org/"
170 , "onload-script" : false
173 , prefix : globalPrefix
174 , production: process.env.NODE_ENV === "production"
175 , "proprietary-attribs": true
176 , proxy : process.env.HTTP_PROXY || process.env.http_proxy || null
177 , "https-proxy" : process.env.HTTPS_PROXY || process.env.https_proxy ||
178 process.env.HTTP_PROXY || process.env.http_proxy || null
179 , "user-agent" : "npm/" + npm.version + " node/" + process.version
180 , "rebuild-bundle" : true
181 , registry : "https://registry.npmjs.org/"
184 , "save-bundle": false
186 , "save-optional" : false
188 , searchexclude: null
190 , shell : osenv.shell()
191 , "sign-git-tag": false
196 , "unsafe-perm" : process.platform === "win32"
197 || process.platform === "cygwin"
198 || !( process.getuid && process.setuid
199 && process.getgid && process.setgid )
200 || process.getuid() !== 0
202 , user : process.platform === "win32" ? 0 : "nobody"
204 , userconfig : path.resolve(home, ".npmrc")
205 , userignorefile : path.resolve(home, ".npmignore")
209 , viewer: process.platform === "win32" ? "browser" : "man"
217 { "always-auth" : Boolean
221 , "cache-lock-stale": Number
222 , "cache-lock-retries": Number
223 , "cache-lock-wait": Number
224 , "cache-max": Number
225 , "cache-min": Number
226 , color : ["always", Boolean]
229 , description : Boolean
232 , "engine-strict": Boolean
234 , "fetch-retries": Number
235 , "fetch-retry-factor": Number
236 , "fetch-retry-mintimeout": Number
237 , "fetch-retry-maxtimeout": Number
240 , globalconfig : path
241 , globalignorefile: path
242 , group : [Number, String]
243 , "https-proxy" : [null, url]
244 , "user-agent" : String
246 , "init-module": path
247 , "init.version" : [null, semver]
248 , "init.author.name" : String
249 , "init.author.email" : String
250 , "init.author.url" : ["", url]
253 , loglevel : ["silent","win","error","warn","http","info","verbose","silly"]
257 , "node-version" : [null, semver]
260 , "onload-script" : [null, String]
261 , parseable : Boolean
264 , production: Boolean
265 , "proprietary-attribs": Boolean
266 , proxy : [null, url]
267 , "rebuild-bundle" : Boolean
268 , registry : [null, url]
271 , "save-bundle": Boolean
272 , "save-dev" : Boolean
273 , "save-optional" : Boolean
274 , searchopts : String
275 , searchexclude: [null, String]
276 , searchsort: [ "name", "-name"
277 , "description", "-description"
278 , "author", "-author"
280 , "keywords", "-keywords" ]
282 , "sign-git-tag": Boolean
283 , "strict-ssl": Boolean
287 , "unsafe-perm" : Boolean
289 , user : [Number, String]
292 , userignorefile : path
297 , yes: [false, null, Boolean]
302 { s : ["--loglevel", "silent"]
303 , d : ["--loglevel", "info"]
304 , dd : ["--loglevel", "verbose"]
305 , ddd : ["--loglevel", "silly"]
306 , noreg : ["--no-registry"]
307 , reg : ["--registry"]
308 , "no-reg" : ["--no-registry"]
309 , silent : ["--loglevel", "silent"]
310 , verbose : ["--loglevel", "verbose"]
311 , quiet: ["--loglevel", "warn"]
312 , q: ["--loglevel", "warn"]
319 , gangster : ["--force"]
320 , gangsta : ["--force"]
321 , desc : ["--description"]
322 , "no-desc" : ["--no-description"]
323 , "local" : ["--no-global"]
326 , p : ["--parseable"]
327 , porcelain : ["--parseable"]
331 , O : ["--save-optional"]
334 , B : ["--save-bundle"]