// defaults, types, and shorthands. var path = require("path") , url = require("url") , Stream = require("stream").Stream , semver = require("semver") , stableFamily = semver.parse(process.version) , nopt = require("nopt") , osenv = require("osenv") try { var log = require("npmlog") } catch (er) { var util = require('util') var log = { warn: function (m) { console.warn(m + util.format.apply(util, [].slice.call(arguments, 1))) } } } exports.Octal = Octal function Octal () {} function validateOctal (data, k, val) { // must be either an integer or an octal string. if (typeof val === "number") { data[k] = "0" + val.toString(8) } if (typeof val === "string") { if (val.charAt(0) !== "0" || isNaN(val)) return false data[k] = "0" + parseInt(val, 8).toString(8) } } function validateSemver (data, k, val) { if (!semver.valid(val)) return false data[k] = semver.valid(val) } function validateStream (data, k, val) { if (!(val instanceof Stream)) return false data[k] = val } nopt.typeDefs.semver = { type: semver, validate: validateSemver } nopt.typeDefs.Octal = { type: Octal, validate: validateOctal } nopt.typeDefs.Stream = { type: Stream, validate: validateStream } nopt.invalidHandler = function (k, val, type, data) { log.warn("invalid config", k + "=" + JSON.stringify(val)) if (Array.isArray(type)) { if (type.indexOf(url) !== -1) type = url else if (type.indexOf(path) !== -1) type = path } switch (type) { case Octal: log.warn("invalid config", "Must be octal number, starting with 0") break case url: log.warn("invalid config", "Must be a full url with 'http://'") break case path: log.warn("invalid config", "Must be a valid filesystem path") break case Number: log.warn("invalid config", "Must be a numeric value") break case Stream: log.warn("invalid config", "Must be an instance of the Stream class") break } } if (!stableFamily || (+stableFamily[2] % 2)) stableFamily = null else stableFamily = stableFamily[1] + "." + stableFamily[2] var defaults var temp = osenv.tmpdir() var home = osenv.home() if (home) process.env.HOME = home else home = temp var globalPrefix Object.defineProperty(exports, "defaults", {get: function () { if (defaults) return defaults if (process.env.PREFIX) { globalPrefix = process.env.PREFIX } else if (process.platform === "win32") { // c:\node\node.exe --> prefix=c:\node\ globalPrefix = path.dirname(process.execPath) } else { // /usr/local/bin/node --> prefix=/usr/local globalPrefix = path.dirname(path.dirname(process.execPath)) // destdir only is respected on Unix if (process.env.DESTDIR) { globalPrefix = path.join(process.env.DESTDIR, globalPrefix) } } return defaults = { "always-auth" : false // are there others? , browser : process.platform === "darwin" ? "open" : process.platform === "win32" ? "start" : "google-chrome" , ca : // the npm CA certificate. "-----BEGIN CERTIFICATE-----\n"+ "MIIChzCCAfACCQDauvz/KHp8ejANBgkqhkiG9w0BAQUFADCBhzELMAkGA1UEBhMC\n"+ "VVMxCzAJBgNVBAgTAkNBMRAwDgYDVQQHEwdPYWtsYW5kMQwwCgYDVQQKEwNucG0x\n"+ "IjAgBgNVBAsTGW5wbSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxDjAMBgNVBAMTBW5w\n"+ "bUNBMRcwFQYJKoZIhvcNAQkBFghpQGl6cy5tZTAeFw0xMTA5MDUwMTQ3MTdaFw0y\n"+ "MTA5MDIwMTQ3MTdaMIGHMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExEDAOBgNV\n"+ "BAcTB09ha2xhbmQxDDAKBgNVBAoTA25wbTEiMCAGA1UECxMZbnBtIENlcnRpZmlj\n"+ "YXRlIEF1dGhvcml0eTEOMAwGA1UEAxMFbnBtQ0ExFzAVBgkqhkiG9w0BCQEWCGlA\n"+ "aXpzLm1lMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDLI4tIqPpRW+ACw9GE\n"+ "OgBlJZwK5f8nnKCLK629Pv5yJpQKs3DENExAyOgDcyaF0HD0zk8zTp+ZsLaNdKOz\n"+ "Gn2U181KGprGKAXP6DU6ByOJDWmTlY6+Ad1laYT0m64fERSpHw/hjD3D+iX4aMOl\n"+ "y0HdbT5m1ZGh6SJz3ZqxavhHLQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAC4ySDbC\n"+ "l7W1WpLmtLGEQ/yuMLUf6Jy/vr+CRp4h+UzL+IQpCv8FfxsYE7dhf/bmWTEupBkv\n"+ "yNL18lipt2jSvR3v6oAHAReotvdjqhxddpe5Holns6EQd1/xEZ7sB1YhQKJtvUrl\n"+ "ZNufy1Jf1r0ldEGeA+0ISck7s+xSh9rQD2Op\n"+ "-----END CERTIFICATE-----\n" , cache : process.platform === "win32" ? path.resolve(process.env.APPDATA || home || temp, "npm-cache") : path.resolve( home || temp, ".npm") , "cache-lock-stale": 60000 , "cache-lock-retries": 10 , "cache-lock-wait": 10000 , "cache-max": Infinity , "cache-min": 0 , color : true , coverage: false , depth: Infinity , description : true , dev : false , editor : osenv.editor() , "engine-strict": false , force : false , "fetch-retries": 2 , "fetch-retry-factor": 10 , "fetch-retry-mintimeout": 10000 , "fetch-retry-maxtimeout": 60000 , git: "git" , global : false , globalconfig : path.resolve(globalPrefix, "etc", "npmrc") , globalignorefile : path.resolve( globalPrefix, "etc", "npmignore") , group : process.platform === "win32" ? 0 : process.env.SUDO_GID || (process.getgid && process.getgid()) , ignore: "" , "init-module": path.resolve(home, '.npm-init.js') , "init.version" : "0.0.0" , "init.author.name" : "" , "init.author.email" : "" , "init.author.url" : "" , json: false , link: false , loglevel : "http" , logstream : process.stderr , long : false , message : "%s" , "node-version" : process.version , npaturl : "http://npat.npmjs.org/" , npat : false , "onload-script" : false , optional: true , parseable : false , pre: false , prefix : globalPrefix , production: process.env.NODE_ENV === "production" , "proprietary-attribs": true , proxy : process.env.HTTP_PROXY || process.env.http_proxy || null , "https-proxy" : process.env.HTTPS_PROXY || process.env.https_proxy || process.env.HTTP_PROXY || process.env.http_proxy || null , "user-agent" : "node/" + process.version , "rebuild-bundle" : true , registry : "https://registry.npmjs.org/" , rollback : true , save : false , "save-bundle": false , "save-dev" : false , "save-optional" : false , searchopts: "" , searchexclude: null , searchsort: "name" , shell : osenv.shell() , "sign-git-tag": false , "strict-ssl": true , tag : "latest" , tmp : temp , unicode : true , "unsafe-perm" : process.platform === "win32" || process.platform === "cygwin" || !( process.getuid && process.setuid && process.getgid && process.setgid ) || process.getuid() !== 0 , usage : false , user : process.platform === "win32" ? 0 : "nobody" , username : "" , userconfig : path.resolve(home, ".npmrc") , userignorefile : path.resolve(home, ".npmignore") , umask: 022 , version : false , versions : false , viewer: process.platform === "win32" ? "browser" : "man" , yes: null , _exit : true } }}) exports.types = { "always-auth" : Boolean , browser : String , ca: [null, String] , cache : path , "cache-lock-stale": Number , "cache-lock-retries": Number , "cache-lock-wait": Number , "cache-max": Number , "cache-min": Number , color : ["always", Boolean] , coverage: Boolean , depth : Number , description : Boolean , dev : Boolean , editor : String , "engine-strict": Boolean , force : Boolean , "fetch-retries": Number , "fetch-retry-factor": Number , "fetch-retry-mintimeout": Number , "fetch-retry-maxtimeout": Number , git: String , global : Boolean , globalconfig : path , globalignorefile: path , group : [Number, String] , "https-proxy" : [null, url] , "user-agent" : String , ignore : String , "init-module": path , "init.version" : [null, semver] , "init.author.name" : String , "init.author.email" : String , "init.author.url" : ["", url] , json: Boolean , link: Boolean , loglevel : ["silent","win","error","warn","http","info","verbose","silly"] , logstream : Stream , long : Boolean , message: String , "node-version" : [null, semver] , npaturl : url , npat : Boolean , "onload-script" : [null, String] , optional: Boolean , parseable : Boolean , pre: Boolean , prefix: path , production: Boolean , "proprietary-attribs": Boolean , proxy : [null, url] , "rebuild-bundle" : Boolean , registry : [null, url] , rollback : Boolean , save : Boolean , "save-bundle": Boolean , "save-dev" : Boolean , "save-optional" : Boolean , searchopts : String , searchexclude: [null, String] , searchsort: [ "name", "-name" , "description", "-description" , "author", "-author" , "date", "-date" , "keywords", "-keywords" ] , shell : String , "sign-git-tag": Boolean , "strict-ssl": Boolean , tag : String , tmp : path , unicode : Boolean , "unsafe-perm" : Boolean , usage : Boolean , user : [Number, String] , username : String , userconfig : path , userignorefile : path , umask: Octal , version : Boolean , versions : Boolean , viewer: String , yes: [false, null, Boolean] , _exit : Boolean , _password: String } exports.shorthands = { s : ["--loglevel", "silent"] , d : ["--loglevel", "info"] , dd : ["--loglevel", "verbose"] , ddd : ["--loglevel", "silly"] , noreg : ["--no-registry"] , reg : ["--registry"] , "no-reg" : ["--no-registry"] , silent : ["--loglevel", "silent"] , verbose : ["--loglevel", "verbose"] , quiet: ["--loglevel", "warn"] , q: ["--loglevel", "warn"] , h : ["--usage"] , H : ["--usage"] , "?" : ["--usage"] , help : ["--usage"] , v : ["--version"] , f : ["--force"] , gangster : ["--force"] , gangsta : ["--force"] , desc : ["--description"] , "no-desc" : ["--no-description"] , "local" : ["--no-global"] , l : ["--long"] , m : ["--message"] , p : ["--parseable"] , porcelain : ["--parseable"] , g : ["--global"] , S : ["--save"] , D : ["--save-dev"] , O : ["--save-optional"] , y : ["--yes"] , n : ["--no-yes"] , B : ["--save-bundle"] }