Detected 1 occurrence(s) of ‘http:\/\/.*\.\.\/\.\.\/\.\.’:
var tf = [doc.name, '-', t.split('/').pop()]\\\\n var i = requestedPath.indexOf('_rewrite')\\\\n if (i !== -1) {\\\\n tf = requestedPath.slice(0, i + 1).concat(tf)\\\\n }\\\\n t = '/' + tf.join('/')\\\\n var h = \\\\\\\"http://\\\\\\\" + req.headers.Host\\\\n\\\\n doc.versions[v].dist.tarball = h + t\\\\n }\\\\n }\\\\n if (doc[\\\\\\\"dist-tags\\\\\\\"]) for (var tag in doc[\\\\\\\"dist-tags\\\\\\\"]) {\\\\n var clean = semver.clean(doc[\\\\\\\"dist-tags\\\\\\\"][tag])\\\\n if (!clean) delete doc[\\\\\\\"dist-tags\\\\\\\"][tag]\\\\n else doc[\\\\\\\"dist-tags\\\\\\\"][tag] = clean\\\\n }\\\\n // end kludge\\\\n\\\\n if (req.query.version) {\\\\n var ver = req.query.version\\\\n // if not a valid version, then treat as a tag.\\\\n if ((!(ver in doc.versions) && (ver in doc[\\\\\\\"dist-tags\\\\\\\"]))\\\\n || !semver.valid(ver)) {\\\\n ver = doc[\\\\\\\"dist-tags\\\\\\\"][ver]\\\\n }\\\\n body = doc.versions[ver]\\\\n if (!body) {\\\\n code = 404\\\\n body = {\\\\\\\"error\\\\\\\" : \\\\\\\"version not found: \\\\\\\"+req.query.version}\\\\n }\\\\n } else {\\\\n body = doc\\\\n for (var i in body) if (i.charAt(0) === \\\\\\\"_\\\\\\\" && i !== \\\\\\\"_id\\\\\\\" && i !== \\\\\\\"_rev\\\\\\\") {\\\\n delete body[i]\\\\n }\\\\n for (var i in body.time) {\\\\n if (!body.versions[i]) delete body.time[i]\\\\n else body.time[i] = new Date(Date.parse(body.time[i])).toISOString()\\\\n }\\\\n }\\\\n\\\\n body = req.query.jsonp\\\\n ? req.query.jsonp + \\\\\\\"(\\\\\\\" + JSON.stringify(body) + \\\\\\\")\\\\\\\"\\\\n : toJSON(body)\\\\n\\\\n return {\\\\n code : code,\\\\n body : body,\\\\n headers : headers\\\\n }\\\\n}\\\"},\\\"updates\\\":{\\\"package\\\":\\\"function (doc, req) {\\\\n require(\\\\\\\"monkeypatch\\\\\\\").patch(Object, Date, Array, String)\\\\n\\\\n var semver = require(\\\\\\\"semver\\\\\\\")\\\\n var valid = require(\\\\\\\"valid\\\\\\\")\\\\n function error (reason) {\\\\n return [{_id: \\\\\\\"error: forbidden\\\\\\\", forbidden:reason}, JSON.stringify({forbidden:reason})]\\\\n }\\\\n\\\\n function ok (doc, message) {\\\\n delete doc.mtime\\\\n delete doc.ctime\\\\n var time = doc.time = doc.time || {}\\\\n time.modified = (new Date()).toISOString()\\\\n time.created = time.created || time.modified\\\\n for (var v in doc.versions) {\\\\n var ver = doc.versions[v]\\\\n delete ver.ctime\\\\n delete ver.mtime\\\\n time[v] = time[v] || (new Date()).toISOString()\\\\n }\\\\n return [doc, JSON.stringify({ok:message})]\\\\n }\\\\n\\\\n if (doc) {\\\\n if (req.query.version) {\\\\n var parsed = semver.valid(req.query.version)\\\\n if (!parsed) {\\\\n // it's a tag.\\\\n var tag = req.query.version\\\\n , ver = JSON.parse(req.body)\\\\n if (!semver.valid(ver)) {\\\\n return error(\\\\\\\"setting tag \\\\\\\"+tag+\\\\\\\" to invalid version: \\\\\\\"+req.body)\\\\n }\\\\n doc[\\\\\\\"dist-tags\\\\\\\"][tag] = semver.clean(ver)\\\\n return ok(doc, \\\\\\\"updated tag\\\\\\\")\\\\n }\\\\n // adding a new version.\\\\n var ver = req.query.version\\\\n if (!semver.valid(ver)) {\\\\n return error(\\\\\\\"invalid version: \\\\\\\"+ver)\\\\n }\\\\n\\\\n if ((ver in doc.versions) || (semver.clean(ver) in doc.versions)) {\\\\n // attempting to overwrite an existing version.\\\\n // not supported at this time.\\\\n if (!req.query.rev || req.query.rev !== doc._rev) {\\\\n return error(\\\\\\\"cannot modify existing version\\\\\\\")\\\\n }\\\\n }\\\\n\\\\n var body = JSON.parse(req.body)\\\\n if (!valid.name(body.name)) {\\\\n return error( \\\\\\\"Invalid name: \\\\\\\"+JSON.stringify(body.name))\\\\n }\\\\n body.version = semver.clean(body.version)\\\\n ver = semver.clean(ver)\\\\n if (body.version !== ver) {\\\\n return error( \\\\\\\"version in doc doesn't match version in request: \\\\\\\"\\\\n + JSON.stringify(body.version)\\\\n + \\\\\\\" !== \\\\\\\" + JSON.stringify(ver) )\\\\n }\\\\n body._id = body.name + \\\\\\\"@\\\\\\\" + body.version\\\\n if (body.description) doc.description = body.description\\\\n if (body.author) doc.author = body.author\\\\n if (body.repository) doc.repository = body.repository\\\\n body.maintainers = doc.maintainers\\\\n\\\\n var tag = req.query.tag\\\\n || (body.publishConfig && body.publishConfig.tag)\\\\n || body.tag\\\\n || \\\\\\\"latest\\\\\\\"\\\\n\\\\n if (!req.query.pre) doc[\\\\\\\"dist-tags\\\\\\\"][tag] = body.version\\\\n doc.versions[ver] = body\\\\n doc.time = doc.time || {}\\\\n doc.time[ver] = (new Date()).toISOString()\\\\n return ok(doc, \\\\\\\"added version\\\\\\\")\\\\n }\\\\n\\\\n // update the package info\\\\n var newdoc = JSON.parse(req.body)\\\\n , changed = false\\\\n if (doc._rev && doc._rev !== newdoc._rev) {\\\\n return error( \\\\\\\"must supply latest _rev to update existing package\\\\\\\" )\\\\n }\\\\n for (var i in newdoc) if (typeof newdoc[i] === \\\\\\\"string\\\\\\\" || i === \\\\\\\"maintainers\\\\\\\") {\\\\n doc[i] = newdoc[i]\\\\n }\\\\n if (newdoc.versions) {\\\\n doc.versions = newdoc.versions\\\\n }\\\\n if (newdoc[\\\\\\\"dist-tags\\\\\\\"]) {\\\\n doc[\\\\\\\"dist-tags\\\\\\\"] = newdoc[\\\\\\\"dist-tags\\\\\\\"]\\\\n }\\\\n if (newdoc.users) {\\\\n if (!doc.users) doc.users = {}\\\\n doc.users[req.userCtx.name] = newdoc.users[req.userCtx.name]\\\\n }\\\\n return ok(doc, \\\\\\\"updated package metadata\\\\\\\")\\\\n } else {\\\\n // Create new package doc\\\\n doc = JSON.parse(req.body)\\\\n if (!doc._id) doc._id = doc.name\\\\n if (!doc.versions) doc.versions = {}\\\\n var latest\\\\n for (var v in doc.versions) {\\\\n if (!semver.valid(v)) return error(\\\\\\\"Invalid version: \\\\\\\"+JSON.stringify(v))\\\\n var p = doc.versions[v]\\\\n if (p.version !== v) return error(\\\\\\\"Version mismatch: \\\\\\\"+JSON.stringify(v)\\\\n +\\\\\\\" !== \\\\\\\"+JSON.stringify(p.version))\\\\n if (!valid.name(p.name)) return error(\\\\\\\"Invalid name: \\\\\\\"+JSON.stringify(p.name))\\\\n latest = semver.clean(v)\\\\n }\\\\n if (!doc['dist-tags']) doc['dist-tags'] = {}\\\\n if (latest) doc[\\\\\\\"dist-tags\\\\\\\"].latest = latest\\\\n return ok(doc, \\\\\\\"created new entry\\\\\\\")\\\\n }\\\\n}\\\"},\\\"rewrites\\\":[{\\\"from\\\":\\\"/\\\",\\\"to\\\":\\\"../../../registry\\\",\\\"method\\\":\\\"GET\\\"},{\\\"from\\\":\\\"/-/jsonp/:jsonp\\\",\\\"to\\\":\\\"_list/short/listAll\\\",\\\"method\\\":\\\"GET\\\"},{\\\"from\\\":\\\"/_session\\\",\\\"to\\\":\\\"../../../_session\\\",\\\"method\\\":\\\"GET\\\"},{\\\"from\\\":\\\"/_session\\\",\\\"to\\\":\\\"../../../_session\\\",\\\"method\\\":\\\"PUT\\\"},{\\\"from\\\":\\\"/_session\\\",\\\"to\\\":\\\"../../../_session\\\",\\\"method\\\":\\\"POST\\\"},{\\\"from\\\":\\\"/_session\\\",\\\"to\\\":\\\"../../../_session\\\",\\\"method\\\":\\\"DELETE\\\"},{\\\"from\\\":\\\"/_session\\\",\\\"to\\\":\\\"../../../_session\\\",\\\"method\\\":\\\"HEAD\\\"},{\\\"from\\\":\\\"/-/all/since\\\",\\\"to\\\":\\\"_list/index/modified\\\",\\\"method\\\":\\\"GET\\\"},{\\\"from\\\":\\\"/-/rss\\\",\\\"to\\\":\\\"_list/rss/modified\\\",\\\"method\\\":\\\"GET\\\"},{\\\"from\\\":\\\"/-/all\\\",\\\"to\\\":\\\"_list/index/listAll\\\",\\\"method\\\":\\\"GET\\\"},{\\\"from\\\":\\\"/-/all/-/jsonp/:jsonp\\\",\\\"to\\\":\\\"_list/index/listAll\\\",\\\"method\\\":\\\"GET\\\"},{\\\"from\\\":\\\"/-/short\\\",\\\"to\\\":\\\"_list/short/listAll\\\",\\\"method\\\":\\\"GET\\\"},{\\\"from\\\":\\\"/-/scripts\\\",\\\"to\\\":\\\"_list/scripts/scripts\\\",\\\"method\\\":\\\"GET\\\"},{\\\"from\\\":\\\"/-/by-field\\\",\\\"to\\\":\\\"_list/byField/byField\\\",\\\"method\\\":\\\"GET\\\"},{\\\"from\\\":\\\"/-/fields\\\",\\\"to\\\":\\\"_list/sortCount/fieldsInUse\\\",\\\"method\\\":\\\"GET\\\",\\\"query\\\":{\\\"group\\\":\\\"true\\\"}},{\\\"from\\\":\\\"/-/needbuild\\\",\\\"to\\\":\\\"_list/needBuild/needBuild\\\",\\\"method\\\":\\\"GET\\\"},{\\\"from\\\":\\\"/-/prebuilt\\\",\\\"to\\\":\\\"_list/preBuilt/needBuild\\\",\\\"method\\\":\\\"GET\\\"},{\\\"from\\\":\\\"/-/nonlocal\\\",\\\"to\\\":\\\"_list/short/nonlocal\\\",\\\"method\\\":\\\"GET\\\"},{\\\"from\\\":\\\"/favicon.ico\\\",\\\"to\\\":\\\"../../npm/favicon.ico\\\",\\\"method\\\":\\\"GET\\\"},{\\\"from\\\":\\\"/-/users\\\",\\\"to\\\":\\\"../../../_users/_design/_auth/_list/index/listAll\\\",\\\"method\\\":\\\"GET\\\"},{\\\"from\\\":\\\"/-/user/:user\\\",\\\"to\\\":\\\"../../../_users/:user\\\",\\\"method\\\":\\\"PUT\\\"},{\\\"from\\\":\\\"/-/user/:user/-rev/:rev\\\",\\\"to\\\":\\\"../../../_users/:user\\\",\\\"method\\\":\\\"PUT\\\"},{\\\"from\\\":\\\"/-/user/:user\\\",\\\"to\\\":\\\"../../../_users/:user\\\",\\\"method\\\":\\\"GET\\\"},{\\\"from\\\":\\\"/_users/:user\\\",\\\"to\\\":\\\"../../../_users/:user\\\",\\\"method\\\":\\\"PUT\\\"},{\\\"from\\\":\\\"/_users/:user\\\",\\\"to\\\":\\\"../../../_users/:user\\\",\\\"method\\\":\\\"GET\\\"},{\\\"from\\\":\\\"/public_users/:user\\\",\\\"to\\\":\\\"../../../public_users/:user\\\",\\\"method\\\":\\\"PUT\\\"},{\\\"from\\\":\\\"/public_users/:user\\\",\\\"to\\\":\\\"../../../public_users/:user\\\",\\\"method\\\":\\\"GET\\\"},{\\\"from\\\":\\\"/-/user-by-email/:email\\\",\\\"to\\\":\\\"../../../_users/_design/_auth/_list/email/listAll\\\",\\\"method\\\":\\\"GET\\\"},{\\\"from\\\":\\\"/-/top\\\",\\\"to\\\":\\\"_view/npmTop\\\",\\\"query\\\":{\\\"group_level\\\":1},\\\"method\\\":\\\"GET\\\"},{\\\"from\\\":\\\"/-/by-user/:user\\\",\\\"to\\\":\\\"_list/byUser/byUser\\\",\\\"method\\\":\\\"GET\\\"},{\\\"from\\\":\\\"/-/starred-by-user/:user\\\",\\\"to\\\":\\\"_list/byUser/starredByUser\\\",\\\"method\\\":\\\"GET\\\"},{\\\"from\\\":\\\"/-/starred-by-package/:user\\\",\\\"to\\\":\\\"_list/byUser/starredByPackage\\\",\\\"method\\\":\\\"GET\\\"},{\\\"from\\\":\\\"/:pkg\\\",\\\"to\\\":\\\"/_show/package/:pkg\\\",\\\"method\\\":\\\"GET\\\"},{\\\"from\\\":\\\"/:pkg/-/jsonp/:jsonp\\\",\\\"to\\\":\\\"/_show/package/:pkg\\\",\\\"method\\\":\\\"GET\\\"},{\\\"from\\\":\\\"/:pkg/:version\\\",\\\"to\\\":\\\"_show/package/:pkg\\\",\\\"method\\\":\\\"GET\\\"},{\\\"from\\\":\\\"/:pkg/:version/-/jsonp/:jsonp\\\",\\\"to\\\":\\\"_show/package/:pkg\\\",\\\"method\\\":\\\"GET\\\"},{\\\"from\\\":\\\"/:pkg/-/:att\\\",\\\"to\\\":\\\"../../:pkg/:att\\\",\\\"method\\\":\\\"GET\\\"},{\\\"from\\\":\\\"/:pkg/-/:att/:rev\\\",\\\"to\\\":\\\"../../:pkg/:att\\\",\\\"method\\\":\\\"PUT\\\"},{\\\"from\\\":\\\"/:pkg/-/:att/-rev/:rev\\\",\\\"to\\\":\\\"../../:pkg/:att\\\",\\\"method\\\":\\\"PUT\\\"},{\\\"from\\\":\\\"/:pkg/-/:att/:rev\\\",\\\"to\\\":\\\"../../:pkg/:att\\\",\\\"method\\\":\\\"DELETE\\\"},{\\\"from\\\":\\\"/:pkg/-/:att/-rev/:rev\\\",\\\"to\\\":\\\"../../:pkg/:att\\\",\\\"method\\\":\\\"DELETE\\\"},{\\\"from\\\":\\\"/:pkg\\\",\\\"to\\\":\\\"/_update/package/:pkg\\\",\\\"method\\\":\\\"PUT\\\"},{\\\"from\\\":\\\"/:pkg/-rev/:rev\\\",\\\"to\\\":\\\"/_update/package/:pkg\\\",\\\"method\\\":\\\"PUT\\\"},{\\\"from\\\":\\\"/:pkg/:version\\\",\\\"to\\\":\\\"_update/package/:pkg\\\",\\\"method\\\":\\\"PUT\\\"},{\\\"from\\\":\\\"/:pkg/:version/-rev/:rev\\\",\\\"to\\\":\\\"_update/package/:pkg\\\",\\\"method\\\":\\\"PUT\\\"},{\\\"from\\\":\\\"/:pkg/:version/-tag/:tag\\\",\\\"to\\\":\\\"_update/package/:pkg\\\",\\\"method\\\":\\\"PUT\\\"},{\\\"from\\\":\\\"/:pkg/:version/-tag/:tag/-rev/:rev\\\",\\\"to\\\":\\\"_update/package/:pkg\\\",\\\"method\\\":\\\"PUT\\\"},{\\\"from\\\":\\\"/:pkg/:version/-pre/:pre\\\",\\\"to\\\":\\\"_update/package/:pkg\\\",\\\"method\\\":\\\"PUT\\\"},{\\\"from\\\":\\\"/:pkg/:version/-pre/:pre/-rev/:rev\\\",\\\"to\\\":\\\"_update/package/:pkg\\\",\\\"method\\\":\\\"PUT\\\"},{\\\"from\\\":\\\"/:pkg/-rev/:rev\\\",\\\"to\\\":\\\"../../:pkg\\\",\\\"method\\\":\\\"DELETE\\\"},{\\\"from\\\":\\\"/-/_view/*\\\",\\\"to\\\":\\\"_view/*\\\",\\\"method\\\":\\\"GET\\\"},{\\\"from\\\":\\\"/-/_list/*\\\",\\\"to\\\":\\\"_list/*\\\",\\\"method\\\":\\\"GET\\\"},{\\\"from\\\":\\\"/-/_show/*\\\",\\\"to\\\":\\\"_show/*\\\",\\\"method\\\":\\\"GET\\\"}],\\\"views\\\":{\\\"updated\\\":{\\\"map\\\":\\\"function (doc) {\\\\n var l = doc[\\\\\\\"dist-tags\\\\\\\"].latest\\\\n , t = doc.time && doc.time[l]\\\\n if (t) emit(t, 1)\\\\n}\\\"},\\\"listAll\\\":{\\\"map\\\":\\\"function (doc) { return emit(doc._id, doc) }\\\"},\\\"modified\\\":{\\\"map\\\":\\\"function (doc) {\\\\n if (!doc.versions) return\\\\n var latest = doc[\\\\\\\"dist-tags\\\\\\\"].latest\\\\n if (!doc.versions[latest]) return\\\\n var time = doc.time && doc.time[latest] || 0\\\\n var t = new Date(time)\\\\n emit(t.getTime(), doc)\\\\n}\\\"},\\\"byEngine\\\":{\\\"map\\\":\\\"function (doc) {\\\\n if (!doc || !doc.versions || !doc[\\\\\\\"dist-tags\\\\\\\"]) return\\\\n var v = doc[\\\\\\\"dist-tags\\\\\\\"].latest\\\\n var d = doc.versions[v]\\\\n if (d && d.engines) emit(doc._id, [d.engines, doc.maintainers])\\\\n }\\\"},\\\"countVersions\\\":{\\\"map\\\":\\\"function (doc) {\\\\n if (!doc || !doc.name) return\\\\n var i = 0\\\\n if (!doc.versions) return emit([i, doc._id], 1)\\\\n for (var v in doc.versions) i++\\\\n emit([i, doc._id], 1)\\\\n}\\\",\\\"reduce\\\":\\\"_sum\\\"},\\\"byKeyword\\\":{\\\"map\\\":\\\"function (doc) {\\\\n if (!doc || !doc.versions || !doc['dist-tags']) return\\\\n var v = doc.versions[doc['dist-tags'].latest]\\\\n if (!v || !v.keywords || !Array.isArray(v.keywords)) return\\\\n v.keywords.forEach(function (kw) {\\\\n emit([kw.toLowerCase(), doc.name, doc.description], 1)\\\\n })\\\\n }\\\",\\\"reduce\\\":\\\"_sum\\\"},\\\"byField\\\":{\\\"map\\\":\\\"function (doc) {\\\\n if (!doc || !doc.versions || !doc[\\\\\\\"dist-tags\\\\\\\"]) return\\\\n var v = doc[\\\\\\\"dist-tags\\\\\\\"].latest\\\\n //Object.keys(doc.versions).forEach(function (v) {\\\\n var d = doc.versions[v]\\\\n if (!d) return\\\\n //emit(d.name + \\\\\\\"@\\\\\\\" + d.version, d.dist.bin || {})\\\\n var out = {}\\\\n for (var i in d) {\\\\n out[i] = d[i] //true\\\\n if (d[i] && typeof d[i] === \\\\\\\"object\\\\\\\" &&\\\\n (i === \\\\\\\"scripts\\\\\\\" || i === \\\\\\\"directories\\\\\\\")) {\\\\n for (var j in d[i]) out[i + \\\\\\\".\\\\\\\" + j] = d[i][j]\\\\n }\\\\n }\\\\n out.maintainers = doc.maintainers\\\\n emit(doc._id, out)\\\\n //})\\\\n }\\\"},\\\"needBuild\\\":{\\\"map\\\":\\\"function (doc) {\\\\n\\\\n if (!doc || !doc.versions || !doc[\\\\\\\"dist-tags\\\\\\\"]) return\\\\n var v = doc[\\\\\\\"dist-tags\\\\\\\"].latest\\\\n //Object.keys(doc.versions).forEach(function (v) {\\\\n var d = doc.versions[v]\\\\n if (!d) return\\\\n if (!d.scripts) return\\\\n var inst = d.scripts.install\\\\n || d.scripts.preinstall\\\\n || d.scripts.postinstall\\\\n if (!inst) return\\\\n //emit(d.name + \\\\\\\"@\\\\\\\" + d.version, d.dist.bin || {})\\\\n emit(d._id, d.dist.bin || {})\\\\n //})\\\\n }\\\"},\\\"scripts\\\":{\\\"map\\\":\\\"function (doc) {\\\\n if (!doc || !doc.versions || !doc[\\\\\\\"dist-tags\\\\\\\"]) return\\\\n var v = doc[\\\\\\\"dist-tags\\\\\\\"].latest\\\\n if (!doc.versions[v]) return\\\\n if (!doc.versions[v].scripts) return\\\\n emit(doc._id, doc.versions[v].scripts)\\\\n }\\\"},\\\"nodeWafInstall\\\":{\\\"map\\\":\\\"function (doc) {\\\\n if (!doc || !doc.versions || !doc[\\\\\\\"dist-tags\\\\\\\"]) return\\\\n var v = doc[\\\\\\\"dist-tags\\\\\\\"].latest\\\\n if (!doc.versions[v]) return\\\\n if (!doc.versions[v].scripts) return\\\\n for (var i in doc.versions[v].scripts) {\\\\n if (doc.versions[v].scripts[i].indexOf(\\\\\\\"node-waf\\\\\\\") !== -1 ||\\\\n doc.versions[v].scripts[i].indexOf(\\\\\\\"make\\\\\\\") !== -1) {\\\\n emit(doc._id, doc.versions[v]._id)\\\\n return\\\\n }\\\\n }\\\\n }\\\"},\\\"badBins\\\":{\\\"map\\\":\\\"function (doc) {\\\\n if (!doc || !doc.versions || !doc[\\\\\\\"dist-tags\\\\\\\"]) return\\\\n var v = doc[\\\\\\\"dist-tags\\\\\\\"].latest\\\\n if (!doc.versions[v]) return\\\\n v = doc.versions[v]\\\\n var b = v.bin\\\\n , d = v.directories && v.directories.bin\\\\n if (!b && !d) return\\\\n if (b && (typeof b === \\\\\\\"string\\\\\\\" || Object.keys(b).length === 1)) {\\\\n // it's ok.\\\\n return\\\\n }\\\\n emit(doc._id, {binHash:b, binDir:d})\\\\n }\\\"},\\\"orphanAttachments\\\":{\\\"map\\\":\\\"function (doc) {\\\\n if (!doc || !doc._attachments) return\\\\n var orphans = []\\\\n , size = 0\\\\n for (var i in doc._attachments) {\\\\n var n = i.substr(doc._id.length + 1).replace(/\\\\\\\\.tgz$/, \\\\\\\"\\\\\\\")\\\\n .replace(/^v/, \\\\\\\"\\\\\\\")\\\\n if (!doc.versions[n] && i.match(/\\\\\\\\.tgz$/)) {\\\\n orphans.push(i)\\\\n size += doc._attachments[i].length\\\\n }\\\\n }\\\\n if (orphans.length) emit(doc._id, {size:size, orphans:orphans})\\\\n }\\\"},\\\"starredByUser\\\":{\\\"map\\\":\\\"function (doc) {\\\\n if (!doc || !doc.users) return\\\\n Object.keys(doc.users).forEach(function (m) {\\\\n if (!doc.users[m]) return\\\\n emit(m, doc._id)\\\\n })\\\\n}\\\"},\\\"starredByPackage\\\":{\\\"map\\\":\\\"function (doc) {\\\\n if (!doc || !doc.users) return\\\\n Object.keys(doc.users).forEach(function (m) {\\\\n if (!doc.users[m]) return\\\\n emit(doc._id, m)\\\\n })\\\\n}\\\"},\\\"byUser\\\":{\\\"map\\\":\\\"function (doc) {\\\\n if (!doc || !doc.maintainers) return\\\\n doc.maintainers.forEach(function (m) {\\\\n emit(m.name, doc._id)\\\\n })\\\\n}\\\"},\\\"npmTop\\\":{\\\"map\\\":\\\"function (doc) {\\\\n if (!doc || !doc.maintainers) return\\\\n var l = doc['dist-tags'] && doc['dist-tags'].latest\\\\n l = l && doc.versions && doc.versions[l]\\\\n if (!l) return\\\\n var desc = doc.description || l.description || ''\\\\n var readme = doc.readme || l.readme || ''\\\\n doc.maintainers.forEach(function (m) {\\\\n emit([m.name, doc._id, desc, readme], 1)\\\\n })\\\\n}\\\",\\\"reduce\\\":\\\"_sum\\\"},\\\"browseAuthors\\\":{\\\"map\\\":\\\"function (doc) {\\\\n if (!doc || !doc.maintainers) return\\\\n var l = doc['dist-tags'] && doc['dist-tags'].latest\\\\n l = l && doc.versions && doc.versions[l]\\\\n if (!l) return\\\\n var desc = doc.description || l.description || ''\\\\n var readme = doc.readme || l.readme || ''\\\\n doc.maintainers.forEach(function (m) {\\\\n emit([m.name, doc._id, desc, readme], 1)\\\\n })\\\\n}\\\",\\\"reduce\\\":\\\"_sum\\\"},\\\"browseUpdated\\\":{\\\"map\\\":\\\"function (doc) {\\\\n if (!doc || !doc.versions) return\\\\n var l = doc['dist-tags'] && doc['dist-tags'].latest\\\\n if (!l) return\\\\n var t = doc.time && doc.time[l]\\\\n if (!t) return\\\\n var v = doc.versions[l]\\\\n if (!v) return\\\\n var d = new Date(t)\\\\n if (!d.getTime()) return\\\\n emit([ d.toISOString(),\\\\n doc._id,\\\\n v.description,\\\\n v.readme ], 1)\\\\n}\\\",\\\"reduce\\\":\\\"_sum\\\"},\\\"browseAll\\\":{\\\"map\\\":\\\"function (doc) {\\\\n if (!doc || !doc.versions) return\\\\n var l = doc['dist-tags'] && doc['dist-tags'].latest\\\\n if (!l) return\\\\n l = doc.versions && doc.versions[l]\\\\n if (!l) return\\\\n var desc = doc.description || l.description || ''\\\\n var readme = doc.readme || l.readme || ''\\\\n emit([doc.name, desc, readme], 1)\\\\n}\\\",\\\"reduce\\\":\\\"_sum\\\"},\\\"analytics\\\":{\\\"map\\\":\\\"function (doc) {\\\\n if (!doc || !doc.time) return\\\\n for (var i in doc.time) {\\\\n var t = doc.time[i]\\\\n var d = new Date(t)\\\\n if (!d.getTime()) return\\\\n var type = i === 'modified' ? 'latest'\\\\n : i === 'created' ? 'created'\\\\n : 'update'\\\\n emit([ type,\\\\n d.getUTCFullYear(),\\\\n d.getUTCMonth() + 1,\\\\n d.getUTCDate(),\\\\n doc._id ], 1)\\\\n }\\\\n}\\\",\\\"reduce\\\":\\\"_sum\\\"},\\\"dependedUpon\\\":{\\\"map\\\":\\\"function (doc) {\\\\n if (!doc) return\\\\n var l = doc['dist-tags'] && doc['dist-tags'].latest\\\\n if (!l) return\\\\n l = doc.versions && doc.versions[l]\\\\n if (!l) return\\\\n var desc = doc.description || l.description || ''\\\\n var readme = doc.readme || l.readme || ''\\\\n var d = l.dependencies\\\\n if (!d) return\\\\n for (var dep in d) {\\\\n emit([dep, doc._id, desc, readme], 1)\\\\n }\\\\n}\\\",\\\"reduce\\\":\\\"_sum\\\"},\\\"browseStarUser\\\":{\\\"map\\\":\\\"function (doc) {\\\\n if (!doc) return\\\\n var l = doc['dist-tags'] && doc['dist-tags'].latest\\\\n if (!l) return\\\\n l = doc.versions && doc.versions[l]\\\\n if (!l) return\\\\n var desc = doc.description || l.description || ''\\\\n var readme = doc.readme || l.readme || ''\\\\n var d = doc.users\\\\n if (!d) return\\\\n for (var user in d) {\\\\n emit([user, doc._id, desc, readme], 1)\\\\n }\\\\n}\\\",\\\"reduce\\\":\\\"_sum\\\"},\\\"browseStarPackage\\\":{\\\"map\\\":\\\"function (doc) {\\\\n if (!doc) return\\\\n var l = doc['dist-tags'] && doc['dist-tags'].latest\\\\n if (!l) return\\\\n l = doc.versions && doc.versions[l]\\\\n if (!l) return\\\\n var desc = doc.description || l.description || ''\\\\n var readme = doc.readme || l.readme || ''\\\\n var d = doc.users\\\\n if (!d) return\\\\n for (var user in d) {\\\\n emit([doc._id, desc, user, readme], 1)\\\\n }\\\\n}\\\",\\\"reduce\\\":\\\"_sum\\\"},\\\"fieldsInUse\\\":{\\\"map\\\":\\\"function (doc) {\\\\n if (!doc.versions || !doc[\\\\\\\"dist-tags\\\\\\\"] || !doc[\\\\\\\"dist-tags\\\\\\\"].latest) {\\\\n return\\\\n }\\\\n var d = doc.versions[doc[\\\\\\\"dist-tags\\\\\\\"].latest]\\\\n if (!d) return\\\\n for (var f in d) {\\\\n emit(f, 1)\\\\n if (d[f] && typeof d[f] === \\\\\\\"object\\\\\\\" &&\\\\n (f === \\\\\\\"scripts\\\\\\\" || f === \\\\\\\"directories\\\\\\\")) {\\\\n for (var i in d[f]) emit(f+\\\\\\\".\\\\\\\"+i, 1)\\\\n }\\\\n }\\\\n}\\\",\\\"reduce\\\":\\\"_sum\\\"},\\\"howBigIsYourPackage\\\":{\\\"map\\\":\\\"function (doc) {\\\\n var s = 0\\\\n , c = 0\\\\n if (!doc) return\\\\n for (var i in doc._attachments) {\\\\n s += doc._attachments[i].length\\\\n c ++\\\\n }\\\\n if (s === 0) return\\\\n emit(doc._id, {_id: doc._id, size: s, count: c, avg: s/c})\\\\n }\\\"}},\\\"lists\\\":{\\\"first\\\":\\\"function (head, req) {\\\\n var row = getRow()\\\\n send(toJSON([row, row.id, row.doc]))\\\\n}\\\",\\\"short\\\":\\\"function (head, req) {\\\\n require(\\\\\\\"monkeypatch\\\\\\\").patch(Object, Date, Array, String)\\\\n\\\\n var out = {}\\\\n , row\\\\n , show = (req.query.show || \\\\\\\"\\\\\\\").split(\\\\\\\",\\\\\\\")\\\\n , v = show.indexOf(\\\\\\\"version\\\\\\\") !== -1\\\\n , t = show.indexOf(\\\\\\\"tag\\\\\\\") !== -1\\\\n while (row = getRow()) {\\\\n if (!row.id) continue\\\\n if (!t && !v) {\\\\n out[row.id] = true\\\\n continue\\\\n }\\\\n var val = row.value\\\\n if (t) Object.keys(val[\\\\\\\"dist-tags\\\\\\\"] || {}).forEach(function (t) {\\\\n out[row.id + \\\\\\\"@\\\\\\\" + t] = true\\\\n })\\\\n if (v) Object.keys(val.versions || {}).forEach(function (v) {\\\\n out[row.id + \\\\\\\"@\\\\\\\" + v] = true\\\\n })\\\\n }\\\\n send(toJSON(Object.keys(out)))\\\\n}\\\",\\\"rss\\\":\\\"function (head, req) {\\\\n var limit = +req.query.limit\\\\n , desc = req.query.descending\\\\n if (!desc || !limit || limit > 50 || limit < 0) {\\\\n start({ code: 403\\\\n , headers: { 'Content-type': 'text/xml' }})\\\\n send('<error><![CDATA[Please retry your request with '\\\\n + '?descending=true&limit=50 query params]]></error>')\\\\n return\\\\n }\\\\n\\\\n start({ code: 200\\\\n // application/rss+xml is correcter, but also annoyinger\\\\n , headers: { \\\\\\\"Content-Type\\\\\\\": \\\\\\\"text/xml\\\\\\\" } })\\\\n send('<?xml version=\\\\\\\"1.0\\\\\\\" encoding=\\\\\\\"UTF-8\\\\\\\"?>'\\\\n +'\\\\\\\\n<!DOCTYPE rss PUBLIC \\\\\\\"-//Netscape Communications//DTD RSS 0.91//EN\\\\\\\" '\\\\n +'\\\\\\\"http://my.netscape.com/publish/formats/rss-0.91.dtd\\\\\\\">'\\\\n +'\\\\\\\\n<rss version=\\\\\\\"0.91\\\\\\\">'\\\\n +'\\\\\\\\n <channel>'\\\\n +'\\\\\\\\n <title>npm recent updates</title>'\\\\n +'\\\\\\\\n <link>http://search.npmjs.org/</link>'\\\\n +'\\\\\\\\n <description>Updates to the npm package registry</description>'\\\\n +'\\\\\\\\n <language>en</language>')\\\\n\\\\n var row\\\\n while (row = getRow()) {\\\\n if (!row.value || !row.value[\\\\\\\"dist-tags\\\\\\\"]) continue\\\\n\\\\n var doc = row.value\\\\n var authors = doc.maintainers.map(function (m) {\\\\n return '<author>' + m.name + '</author>'\\\\n }).join('\\\\\\\\n ')\\\\n\\\\n var latest = doc[\\\\\\\"dist-tags\\\\\\\"].latest\\\\n var time = doc.time && doc.time[latest]\\\\n var date = new Date(time)\\\\n doc = doc.versions[latest]\\\\n if (!doc || !time || !date) continue\\\\n\\\\n var url = doc.homepage\\\\n , repo = doc.repository || doc.repositories\\\\n if (!url && repo) {\\\\n if (Array.isArray(repo)) repo = repo.shift()\\\\n if (repo.url) repo = repo.url\\\\n if (repo && (typeof repo === \\\\\\\"string\\\\\\\")) {\\\\n url = repo.replace(/^git(@|:\\\\\\\\/\\\\\\\\/)/, 'http://')\\\\n .replace(/\\\\\\\\.git$/, '')+\\\\\\\"#readme\\\\\\\"\\\\n }\\\\n }\\\\n if (!url) url = \\\\\\\"http://search.npmjs.org/#/\\\\\\\" + doc.name\\\\n\\\\n send('\\\\\\\\n <item>'\\\\n +'\\\\\\\\n <title>' + doc._id + '</title>'\\\\n +'\\\\\\\\n <link>' + url + '</link>'\\\\n +'\\\\\\\\n ' + authors\\\\n +'\\\\\\\\n <description><![CDATA['\\\\n + (doc.description || '').trim() + ']]></description>'\\\\n +'\\\\\\\\n <pubDate>' + date.toISOString() + '</pubDate>'\\\\n +'\\\\\\\\n </item>')\\\\n }\\\\n send('\\\\\\\\n </channel>'\\\\n +'\\\\\\\\n</rss>')\\\\n}\\\",\\\"index\\\":\\\"function (head, req) {\\\\n require(\\\\\\\"monkeypatch\\\\\\\").patch(Object, Date, Array, String)\\\\n var basePath = req.requested_path\\\\n if (basePath.indexOf(\\\\\\\"_list\\\\\\\") === -1) basePath = \\\\\\\"\\\\\\\"\\\\n else {\\\\n basePath = basePath.slice(0, basePath.indexOf(\\\\\\\"_list\\\\\\\"))\\\\n .concat([\\\\\\\"_rewrite\\\\\\\", \\\\\\\"\\\\\\\"]).join(\\\\\\\"/\\\\\\\")\\\\n }\\\\n\\\\n var row\\\\n , semver = require(\\\\\\\"semver\\\\\\\")\\\\n , res = []\\\\n\\\\n if (req.query.jsonp) send(req.query.jsonp + \\\\\\\"(\\\\\\\")\\\\n send('{\\\\\\\"_updated\\\\\\\":' + Date.now())\\\\n while (row = getRow()) {\\\\n if (!row.id) continue\\\\n\\\\n var doc = row.value\\\\n if (!doc.name || !doc._id ||\\\\n encodeURIComponent(doc._id) !== doc._id) continue\\\\n\\\\n var p = {}\\\\n\\\\n // legacy kludge\\\\n delete doc.mtime\\\\n delete doc.ctime\\\\n if (doc.versions) for (var v in doc.versions) {\\\\n var clean = semver.clean(v)\\\\n delete doc.versions[v].ctime\\\\n delete doc.versions[v].mtime\\\\n if (clean !== v) {\\\\n var x = doc.versions[v]\\\\n delete doc.versions[v]\\\\n x.version = v = clean\\\\n doc.versions[clean] = x\\\\n }\\\\n }\\\\n if (doc[\\\\\\\"dist-tags\\\\\\\"]) for (var tag in doc[\\\\\\\"dist-tags\\\\\\\"]) {\\\\n var clean = semver.clean(doc[\\\\\\\"dist-tags\\\\\\\"][tag])\\\\n if (!clean) delete doc[\\\\\\\"dist-tags\\\\\\\"][tag]\\\\n else doc[\\\\\\\"dist-tags\\\\\\\"][tag] = clean\\\\n }\\\\n // end kludge\\\\n\\\\n for (var i in doc) {\\\\n if (i === \\\\\\\"versions\\\\\\\" || i.charAt(0) === \\\\\\\"_\\\\\\\" || i === 'readme' ||\\\\n i === 'time') continue\\\\n p[i] = doc[i]\\\\n }\\\\n if (doc.time) {\\\\n p.time = { modified: doc.time.modified }\\\\n }\\\\n if (p['dist-tags'] && typeof p['dist-tags'] === 'object') {\\\\n p.versions = Object.keys(p['dist-tags']).reduce(function (ac, v) {\\\\n ac[ p['dist-tags'][v] ] = v\\\\n return ac\\\\n }, {})\\\\n }\\\\n if (doc.repositories && Array.isArray(doc.repositories)) {\\\\n doc.repository = doc.repositories[0]\\\\n delete doc.repositories\\\\n }\\\\n if (doc.repository) p.repository = doc.repository\\\\n if (doc.description) p.description = doc.description\\\\n for (var i in doc.versions) {\\\\n if (doc.versions[i].repository && !doc.repository) {\\\\n p.repository = doc.versions[i].repository\\\\n }\\\\n if (doc.versions[i].keywords) p.keywords = doc.versions[i].keywords\\\\n }\\\\n send(',' + JSON.stringify(doc._id) + ':' + JSON.stringify(p))\\\\n }\\\\n send('}')\\\\n if (req.query.jsonp) send(')')\\\\n\\\\n}\\\",\\\"byField\\\":\\\"function (head, req) {\\\\n require(\\\\\\\"monkeypatch\\\\\\\").patch(Object, Date, Array, String)\\\\n\\\\n if (!req.query.field) {\\\\n start({\\\\\\\"code\\\\\\\":\\\\\\\"400\\\\\\\", \\\\\\\"headers\\\\\\\": {\\\\\\\"Content-Type\\\\\\\": \\\\\\\"application/json\\\\\\\"}})\\\\n send('{\\\\\\\"error\\\\\\\":\\\\\\\"Please specify a field parameter\\\\\\\"}')\\\\n return\\\\n }\\\\n\\\\n start({\\\\\\\"code\\\\\\\": 200, \\\\\\\"headers\\\\\\\": {\\\\\\\"Content-Type\\\\\\\": \\\\\\\"application/json\\\\\\\"}})\\\\n var row\\\\n , out = {}\\\\n , field = req.query.field\\\\n , not = field.charAt(0) === \\\\\\\"!\\\\\\\"\\\\n if (not) field = field.substr(1)\\\\n while (row = getRow()) {\\\\n if (!row.id) continue\\\\n var has = row.value.hasOwnProperty(field)\\\\n if (!not && !has || not && has) continue\\\\n out[row.key] = { \\\\\\\"maintainers\\\\\\\": row.value.maintainers.map(function (m) {\\\\n return m.name + \\\\\\\" <\\\\\\\" + m.email + \\\\\\\">\\\\\\\"\\\\n }) }\\\\n if (has) out[row.key][field] = row.value[field]\\\\n }\\\\n send(JSON.stringify(out))\\\\n}\\\",\\\"preBuilt\\\":\\\"function (head, req) {\\\\n start({\\\\\\\"code\\\\\\\": 200, \\\\\\\"headers\\\\\\\": {\\\\\\\"Content-Type\\\\\\\": \\\\\\\"text/plain\\\\\\\"}});\\\\n var row\\\\n , out = []\\\\n while (row = getRow()) {\\\\n if (!row.id) continue\\\\n if (!(req.query.bindist && row.value[req.query.bindist])) continue\\\\n out.push(row.key)\\\\n }\\\\n send(out.join(\\\\\\\"\\\\\\\\n\\\\\\\"))\\\\n}\\\",\\\"needBuild\\\":\\\"function (head, req) {\\\\n start({\\\\\\\"code\\\\\\\": 200, \\\\\\\"headers\\\\\\\": {\\\\\\\"Content-Type\\\\\\\": \\\\\\\"text/plain\\\\\\\"}});\\\\n var row\\\\n , first = true\\\\n while (row = getRow()) {\\\\n if (!row.id) continue\\\\n if (req.query.bindist && row.value[req.query.bindist]) continue\\\\n // out.push(row.key)\\\\n send((first ? \\\\\\\"{\\\\\\\" : \\\\\\\",\\\\\\\")\\\\n + JSON.stringify(row.key)\\\\n + \\\\\\\":\\\\\\\"\\\\n + JSON.stringify(Object.keys(row.value))\\\\n + \\\\\\\"\\\\\\\\n\\\\\\\")\\\\n first = false\\\\n }\\\\n send(\\\\\\\"}\\\\\\\\n\\\\\\\")\\\\n}\\\",\\\"scripts\\\":\\\"function (head, req) {\\\\n var row\\\\n , out = {}\\\\n , scripts = req.query.scripts && req.query.scripts.split(\\\\\\\",\\\\\\\")\\\\n , match = req.query.match\\\\n\\\\n if (match) match = new RegExp(match)\\\\n\\\\n while (row = getRow()) {\\\\n inc = true\\\\n if (!row.id) continue\\\\n if (req.query.package && row.id !== req.query.package) continue\\\\n if (scripts && scripts.length) {\\\\n var inc = false\\\\n for (var s = 0, l = scripts.length; s < l && !inc; s ++) {\\\\n inc = row.value[scripts[s]]\\\\n if (match) inc = inc && row.value[scripts[s]].match(match)\\\\n }\\\\n if (!inc) continue\\\\n }\\\\n out[row.id] = row.value\\\\n }\\\\n send(toJSON(out))\\\\n}\\\",\\\"rowdump\\\":\\\"function (head, req) {\\\\n var rows = []\\\\n while (row = getRow()) rows.push(row)\\\\n send(toJSON(rows))\\\\n}\\\",\\\"passthrough\\\":\\\"function (head, req) {\\\\n var out = {}\\\\n , row\\\\n while (row = getRow()) {\\\\n if (!row.id) continue\\\\n out[row.id] = row.value\\\\n }\\\\n send(toJSON(out))\\\\n}\\\",\\\"byUser\\\":\\\"function (head, req) {\\\\n var out = {}\\\\n , user = req.query.user && req.query.user !== \\\\\\\"-\\\\\\\" ? req.query.user : null\\\\n , users = user && user.split(\\\\\\\"|\\\\\\\")\\\\n while (row = getRow()) {\\\\n if (!user || users.indexOf(row.key) !== -1) {\\\\n var l = out[row.key] = out[row.key] || []\\\\n l.push(row.value)\\\\n }\\\\n }\\\\n send(toJSON(out))\\\\n}\\\",\\\"sortCount\\\":\\\"function (head, req) {\\\\n var out = []\\\\n while (row = getRow()) {\\\\n out.push([row.key, row.value])\\\\n }\\\\n out = out.sort(function (a, b) {\\\\n return a[1] === b[1] ? 0\\\\n : a[1] < b[1] ? 1 : -1\\\\n })\\\\n var outObj = {}\\\\n for (var i = 0, l = out.length; i < l; i ++) {\\\\n outObj[out[i][0]] = out[i][1]\\\\n }\\\\n send(toJSON(outObj))\\\\n}\\\",\\\"size\\\":\\\"function (head, req) {\\\\n var row\\\\n , out = []\\\\n , max = 0\\\\n while (row = getRow()) {\\\\n if (!row.id) continue\\\\n out.push(row.value)\\\\n }\\\\n var list = []\\\\n out = out.sort(function (a, b) {\\\\n max = Math.max(max, a.size, b.size)\\\\n return a.size > b.size ? -1 : 1\\\\n })\\\\n .reduce(function (l, r) {\\\\n var stars = new Array(Math.ceil(80 * (r.size/max)) + 1).join(\\\\\\\"\\\\\\\\u25FE\\\\\\\")\\\\n l[r._id] = { size: r.size\\\\n , count: r.count\\\\n , avg: r.avg\\\\n , rel: r.size / max\\\\n , s: stars\\\\n }\\\\n return l\\\\n }, {})\\\\n send(JSON.stringify(out))\\\\n}\\\",\\\"histogram\\\":\\\"function (head, req) {\\\\n require(\\\\\\\"monkeypatch\\\\\\\").patch(Object, Date, Array, String)\\\\n start({\\\\\\\"code\\\\\\\": 200, \\\\\\\"headers\\\\\\\": {\\\\\\\"Content-Type\\\\\\\": \\\\\\\"text/plain\\\\\\\"}});\\\\n var row\\\\n , out = []\\\\n , max = {}\\\\n , field = req.query.field\\\\n , sort = req.query.sort\\\\n , doAll = !field\\\\n\\\\n while (row = getRow()) {\\\\n if (!row.id) continue\\\\n out.push(row.value)\\\\n }\\\\n\\\\n if (!doAll) out.sort(function (a, b) {\\\\n max[field] = Math.max(max[field] || -Infinity, a[field], b[field])\\\\n return a[field] > b[field] ? -1 : 1\\\\n })\\\\n else out.sort(function (a, b) {\\\\n for (var field in a) if (field.charAt(0) !== \\\\\\\"_\\\\\\\" && !isNaN(a[field])) {\\\\n max[field] = Math.max(max[field] || -Infinity, a[field])\\\\n }\\\\n for (var field in b) if (field.charAt(0) !== \\\\\\\"_\\\\\\\" && !isNaN(b[field])) {\\\\n max[field] = Math.max(max[field] || -Infinity, b[field])\\\\n }\\\\n if (sort) {\\\\n return Number(a[sort]) > Number(b[sort]) ? -1 : 1\\\\n } else {\\\\n return 0\\\\n }\\\\n })\\\\n if (doAll) {\\\\n // sort the fields by the max sizes.\\\\n var m = {}\\\\n Object.keys(max).sort(function (a, b) {\\\\n return max[a] > max[b] ? -1 : 1\\\\n }).forEach(function (k) { m[k] = max[k] })\\\\n max = m\\\\n }\\\\n out = out.map(function (a) {\\\\n var o = {}\\\\n for (var f in max) {\\\\n var blk = new Array(Math.ceil(80*(a[f] / max[f])+1)).join(\\\\\\\"#\\\\\\\")\\\\n , spc = new Array(80 - blk.length + 1).join(\\\\\\\" \\\\\\\")\\\\n o[f] = spc + blk + \\\\\\\" \\\\\\\" + a[f]\\\\n }\\\\n o._id = a._id\\\\n return o\\\\n }).reduce(function (l, r) {\\\\n l[r._id] = r\\\\n return l\\\\n }, {})\\\\n\\\\n var spc = new Array(82).join(\\\\\\\" \\\\\\\")\\\\n send(Object.keys(out).map(function (i) {\\\\n if (doAll) return [spc + i].concat(Object.keys(max).map(function (f) {\\\\n return out[i][f] + \\\\\\\" \\\\\\\" + f\\\\n })).join(\\\\\\\"\\\\\\\\n\\\\\\\") + \\\\\\\"\\\\\\\\n\\\\\\\"\\\\n return out[i][field] + \\\\\\\" \\\\\\\" + i\\\\n }).join(\\\\\\\"\\\\\\\\n\\\\\\\"))\\\\n}\\\"},\\\"validate_doc_update\\\":\\\"function (doc, oldDoc, user, dbCtx) {\\\\n // can't write to the db without logging in.\\\\n if (!user || !user.name) {\\\\n throw { unauthorized: \\\\\\\"Please log in before writing to the db\\\\\\\" }\\\\n }\\\\n\\\\n require(\\\\\\\"monkeypatch\\\\\\\").patch(Object, Date, Array, String)\\\\n\\\\n var semver = require(\\\\\\\"semver\\\\\\\")\\\\n var valid = require(\\\\\\\"valid\\\\\\\")\\\\n var deep = require(\\\\\\\"deep\\\\\\\")\\\\n var deepEquals = deep.deepEquals\\\\n\\\\n\\\\n if (oldDoc) oldDoc.users = oldDoc.users || {}\\\\n doc.users = doc.users || {}\\\\n\\\\n\\\\n function assert (ok, message) {\\\\n if (!ok) throw {forbidden:message}\\\\n }\\\\n\\\\n // admins can do ANYTHING (even break stuff)\\\\n if (isAdmin()) return\\\\n\\\\n // figure out what changed in the doc.\\\\n function diffObj (o, n, p) {\\\\n p = p || \\\\\\\"\\\\\\\"\\\\n var d = []\\\\n var seenKeys = []\\\\n for (var i in o) {\\\\n seenKeys.push(i)\\\\n if (!(i in n)) {\\\\n d.push(\\\\\\\"Deleted: \\\\\\\"+p+i)\\\\n }\\\\n if (typeof o[i] !== typeof n[i]) {\\\\n d.push(\\\\\\\"Changed Type: \\\\\\\"+p+i)\\\\n }\\\\n if (typeof o[i] === \\\\\\\"object\\\\\\\" && o[i] && !n[i]) {\\\\n d.push(\\\\\\\"Nulled: \\\\\\\"+p+i)\\\\n }\\\\n if (typeof o[i] === \\\\\\\"object\\\\\\\" && !o[i] && n[i]) {\\\\n d.push(\\\\\\\"Un-nulled: \\\\\\\"+p+i)\\\\n }\\\\n if (typeof o[i] === \\\\\\\"object\\\\\\\") {\\\\n d = d.concat(diffObj(o[i], n[i], p + i + \\\\\\\".\\\\\\\"))\\\\n } else {\\\\n if (o[i] !== n[i]) {\\\\n d.push(\\\\\\\"Changed: \\\\\\\"+p+i+\\\\\\\" \\\\\\\"+JSON.stringify(o[i]) + \\\\\\\" -> \\\\\\\"\\\\n +JSON.stringify(n[i]))\\\\n }\\\\n }\\\\n }\\\\n for (var i in n) {\\\\n if (-1 === seenKeys.indexOf(i)) {\\\\n d.push(\\\\\\\"Added: \\\\\\\"+p+i)\\\\n }\\\\n }\\\\n return d\\\\n }\\\\n\\\\n // if the doc is an {error:\\\\\\\"blerg\\\\\\\"}, then throw that right out.\\\\n // something detected in the _updates/package script.\\\\n // XXX: Make this not ever happen ever. Validation belongs here,\\\\n // not in the update function.\\\\n assert(!doc.forbidden || doc._deleted, doc.forbidden)\\\\n\\\\n // everyone may alter his \\\\\\\"starred\\\\\\\" status on any package\\\\n if (oldDoc &&\\\\n !doc._deleted &&\\\\n deepEquals(doc, oldDoc,\\\\n [[\\\\\\\"users\\\\\\\", user.name], [\\\\\\\"time\\\\\\\", \\\\\\\"modified\\\\\\\"]])) {\\\\n return\\\\n }\\\\n\\\\n\\\\n // check if the user is allowed to write to this package.\\\\n function validUser () {\\\\n if ( !oldDoc || !oldDoc.maintainers ) return true\\\\n if (isAdmin()) return true\\\\n if (typeof oldDoc.maintainers !== \\\\\\\"object\\\\\\\") return true\\\\n for (var i = 0, l = oldDoc.maintainers.length; i < l; i ++) {\\\\n if (oldDoc.maintainers[i].name === user.name) return true\\\\n }\\\\n return false\\\\n }\\\\n\\\\n function isAdmin () {\\\\n if (dbCtx &&\\\\n dbCtx.admins) {\\\\n if (dbCtx.admins.names &&\\\\n dbCtx.admins.roles &&\\\\n dbCtx.admins.names.indexOf(user.name) !== -1) return true\\\\n for (var i=0;i<user.roles.length;i++) {\\\\n if (dbCtx.admins.roles.indexOf(user.roles[i]) !== -1) return true\\\\n }\\\\n }\\\\n return user.roles.indexOf(\\\\\\\"_admin\\\\\\\") >= 0\\\\n }\\\\n\\\\n var vu = validUser()\\\\n if (!vu) {\\\\n assert(vu, \\\\\\\"user: \\\\\\\" + user.name + \\\\\\\" not authorized to modify \\\\\\\"\\\\n + doc.name + \\\\\\\"\\\\\\\\n\\\\\\\"\\\\n + diffObj(oldDoc, doc).join(\\\\\\\"\\\\\\\\n\\\\\\\"))\\\\n }\\\\n\\\\n // deleting a document entirely *is* allowed.\\\\n if (doc._deleted) return\\\\n\\\\n // sanity checks.\\\\n assert(valid.name(doc.name), \\\\\\\"name invalid: \\\\\\\"+doc.name)\\\\n\\\\n // New documents may only be created with all lowercase names.\\\\n // At some point, existing docs will be migrated to lowercase names\\\\n // as well.\\\\n if (!oldDoc && doc.name !== doc.name.toLowerCase()) {\\\\n assert(false, \\\\\\\"New packages must have all-lowercase names\\\\\\\")\\\\n }\\\\n\\\\n assert(doc.name === doc._id, \\\\\\\"name must match _id\\\\\\\")\\\\n assert(!doc.mtime, \\\\\\\"doc.mtime is deprecated\\\\\\\")\\\\n assert(!doc.ctime, \\\\\\\"doc.ctime is deprecated\\\\\\\")\\\\n assert(typeof doc.time === \\\\\\\"object\\\\\\\", \\\\\\\"time must be object\\\\\\\")\\\\n\\\\n assert(typeof doc[\\\\\\\"dist-tags\\\\\\\"] === \\\\\\\"object\\\\\\\", \\\\\\\"dist-tags must be object\\\\\\\")\\\\n\\\\n var versions = doc.versions\\\\n assert(typeof versions === \\\\\\\"object\\\\\\\", \\\\\\\"versions must be object\\\\\\\")\\\\n\\\\n var latest = doc[\\\\\\\"dist-tags\\\\\\\"].latest\\\\n if (latest) {\\\\n assert(versions[latest], \\\\\\\"dist-tags.latest must be valid version\\\\\\\")\\\\n }\\\\n\\\\n for (var v in doc[\\\\\\\"dist-tags\\\\\\\"]) {\\\\n var ver = doc[\\\\\\\"dist-tags\\\\\\\"][v]\\\\n assert(semver.valid(ver),\\\\n v + \\\\\\\" version invalid version: \\\\\\\" + ver)\\\\n assert(versions[ver],\\\\n v + \\\\\\\" version missing: \\\\\\\" + ver)\\\\n }\\\\n\\\\n for (var ver in versions) {\\\\n var version = versions[ver]\\\\n assert(semver.valid(ver),\\\\n \\\\\\\"invalid version: \\\\\\\" + ver)\\\\n assert(typeof version === \\\\\\\"object\\\\\\\",\\\\n \\\\\\\"version entries must be objects\\\\\\\")\\\\n assert(version.version === ver,\\\\n \\\\\\\"version must match: \\\\\\\"+ver)\\\\n assert(version.name === doc._id,\\\\n \\\\\\\"version \\\\\\\"+ver+\\\\\\\" has incorrect name: \\\\\\\"+version.name)\\\\n }\\\\n\\\\n assert(Array.isArray(doc.maintainers),\\\\n \\\\\\\"maintainers should be a list of owners\\\\\\\")\\\\n doc.maintainers.forEach(function (m) {\\\\n assert(m.name && m.email,\\\\n \\\\\\\"Maintainer should have name and email: \\\\\\\" + JSON.stringify(m))\\\\n })\\\\n\\\\n var time = doc.time\\\\n var c = new Date(Date.parse(time.created))\\\\n , m = new Date(Date.parse(time.modified))\\\\n assert(c.toString() !== \\\\\\\"Invalid Date\\\\\\\",\\\\n \\\\\\\"invalid created time: \\\\\\\" + JSON.stringify(time.created))\\\\n\\\\n assert(m.toString() !== \\\\\\\"Invalid Date\\\\\\\",\\\\n \\\\\\\"invalid modified time: \\\\\\\" + JSON.stringify(time.modified))\\\\n\\\\n if (oldDoc &&\\\\n oldDoc.time &&\\\\n oldDoc.time.created &&\\\\n Date.parse(oldDoc.time.created)) {\\\\n assert(Date.parse(oldDoc.time.created) === Date.parse(time.created),\\\\n \\\\\\\"created time cannot be changed\\\\\\\")\\\\n }\\\\n\\\\n if (oldDoc && oldDoc.users) {\\\\n assert(deepEquals(doc.users,\\\\n oldDoc.users, [[user.name]]),\\\\n \\\\\\\"you may only alter your own 'star' setting\\\\\\\")\\\\n }\\\\n\\\\n if (doc.url) {\\\\n assert(false,\\\\n \\\\\\\"Package redirection has been removed. \\\\\\\"+\\\\n \\\\\\\"Please update your publish scripts.\\\\\\\")\\\\n }\\\\n\\\\n\\\\n // at this point, we've passed the basic sanity tests.\\\\n // Time to dig into more details.\\\\n // Valid operations:\\\\n // 1. Add a version\\\\n // 2. Remove a version\\\\n // 3. Modify a version\\\\n // 4. Add or remove onesself from the \\\\\\\"users\\\\\\\" hash (already done)\\\\n //\\\\n // If a version is being added or changed, make sure that the\\\\n // _npmUser field matches the current user, and that the\\\\n // time object has the proper entry, and that the \\\\\\\"maintainers\\\\\\\"\\\\n // matches the current \\\\\\\"maintainers\\\\\\\" field.\\\\n //\\\\n // Things that must not change:\\\\n //\\\\n // 1. More than one version being modified.\\\\n // 2. Removing keys from the \\\\\\\"time\\\\\\\" hash\\\\n //\\\\n // Later, once we are off of the update function 3-stage approach,\\\\n // these things should also be errors:\\\\n //\\\\n // 1. Lacking an attachment for any published version.\\\\n // 2. Having an attachment for any version not published.\\\\n\\\\n var oldVersions = oldDoc ? oldDoc.versions || {} : {}\\\\n var oldTime = oldDoc ? oldDoc.time || {} : {}\\\\n\\\\n var versions = Object.keys(doc.versions)\\\\n , modified = null\\\\n\\\\n for (var i = 0, l = versions.length; i < l; i ++) {\\\\n var v = versions[i]\\\\n if (!v) continue\\\\n assert(doc.time[v], \\\\\\\"must have time entry for \\\\\\\"+v)\\\\n\\\\n if (!deepEquals(doc.versions[v], oldVersions[v], [[\\\\\\\"directories\\\\\\\"], [\\\\\\\"deprecated\\\\\\\"]]) &&\\\\n doc.versions[v]) {\\\\n // this one was modified\\\\n // if it's more than a few minutes off, then something is wrong.\\\\n var t = Date.parse(doc.time[v])\\\\n , n = Date.now()\\\\n // assert(doc.time[v] !== oldTime[v] &&\\\\n // Math.abs(n - t) < 1000 * 60 * 60,\\\\n // v + \\\\\\\" time needs to be updated\\\\\\\\n\\\\\\\" +\\\\n // \\\\\\\"new=\\\\\\\" + JSON.stringify(doc.versions[v]) + \\\\\\\"\\\\\\\\n\\\\\\\" +\\\\n // \\\\\\\"old=\\\\\\\" + JSON.stringify(oldVersions[v]))\\\\n\\\\n // var mt = Date.parse(doc.time.modified).getTime()\\\\n // , vt = t.getTime()\\\\n // assert(Math.abs(mt - vt) < 1000 * 60 * 60,\\\\n // v + \\\\\\\" is modified, should match modified time\\\\\\\")\\\\n\\\\n // XXX Remove the guard these once old docs have been found and\\\\n // fixed. It's too big of a pain to have to manually fix\\\\n // each one every time someone complains.\\\\n if (typeof doc.versions[v]._npmUser !== \\\\\\\"object\\\\\\\") continue\\\\n\\\\n\\\\n assert(typeof doc.versions[v]._npmUser === \\\\\\\"object\\\\\\\",\\\\n \\\\\\\"_npmUser field must be object\\\\\\\\n\\\\\\\"+\\\\n \\\\\\\"(You probably need to upgrade your npm version)\\\\\\\")\\\\n assert(doc.versions[v]._npmUser.name === user.name,\\\\n \\\\\\\"_npmUser.name must === user.name\\\\\\\")\\\\n assert(deepEquals(doc.versions[v].maintainers,\\\\n doc.maintainers),\\\\n \\\\\\\"modified version 'maintainers' must === doc.maintainers\\\\\\\")\\\\n\\\\n // make sure that the _npmUser is one of the maintainers\\\\n var found = false\\\\n for (var j = 0, lm = doc.maintainers.length; j < lm; j ++) {\\\\n var m = doc.maintainers[j]\\\\n if (m.name === doc.versions[v]._npmUser.name) {\\\\n found = true\\\\n break\\\\n }\\\\n }\\\\n assert(found, \\\\\\\"_npmUser must be a current maintainer.\\\\\\\\n\\\\\\\"+\\\\n \\\\\\\"maintainers=\\\\\\\" + JSON.stringify(doc.maintainers)+\\\\\\\"\\\\\\\\n\\\\\\\"+\\\\n \\\\\\\"current user=\\\\\\\" + JSON.stringify(doc.versions[v]._npmUser))\\\\n\\\\n } else if (oldTime[v]) {\\\\n assert(oldTime[v] === doc.time[v],\\\\n v + \\\\\\\" time should not be modified 1\\\\\\\")\\\\n }\\\\n }\\\\n\\\\n // now go through all the time settings that weren't covered\\\\n for (var v in oldTime) {\\\\n if (doc.versions[v] || !oldVersions[v]) continue\\\\n assert(doc.time[v] === oldTime[v],\\\\n v + \\\\\\\" time should not be modified 2\\\\\\\")\\\\n }\\\\n\\\\n}\\\",\\\"language\\\":\\\"javascript\\\",\\\"deep\\\":\\\"exports.deepEquals = deepEquals\\\\nexports.extend = deepExtend\\\\nfunction deepExtend(o1, o2) {\\\\n // extend o1 with o2 (in-place)\\\\n for (var prop in o2) {\\\\n if (hOP(o2, prop)) {\\\\n if (hOP(o1, prop)) {\\\\n if (typeof o1[prop] === \\\\\\\"object\\\\\\\") {\\\\n deepExtend(o1[prop], o2[prop])\\\\n }\\\\n } else {\\\\n o1[prop] = o2[prop]\\\\n }\\\\n }\\\\n }\\\\n return o1\\\\n }\\\\nfunction fullPath(pathPrefix, p){\\\\n return pathPrefix.concat([p])\\\\n }\\\\nfunction isObject(v){\\\\n return typeof v === 'object'\\\\n }\\\\nfunction arrayInArray(v, arr) {\\\\n // Check whether `arr` contains an array that's shallowly equal to `v`.\\\\n return arr.some(function(e) {\\\\n if (e.length !== v.length) return false\\\\n for (var i=0; i<e.length; i++) {\\\\n if (e[i] !== v[i]) {\\\\n return false\\\\n }\\\\n }\\\\n return true\\\\n })\\\\n }\\\\nfunction deepEquals(o1, o2, ignoreKeys, pathPrefix){\\\\n pathPrefix = pathPrefix || []\\\\n ignoreKeys = ignoreKeys || []\\\\n function hOP (obj, prop) {\\\\n return Object.prototype.hasOwnProperty.call(obj, prop)\\\\n }\\\\n if (typeof o1 !== typeof o2) {\\\\n return false\\\\n } else if (!isObject(o1)) {\\\\n return o1 === o2\\\\n }\\\\n for (var prop in o1) {\\\\n if (hOP(o1, prop) &&\\\\n !arrayInArray(fullPath(pathPrefix, prop), ignoreKeys)) {\\\\n if (!hOP(o2, prop) ||\\\\n !deepEquals(o1[prop],\\\\n o2[prop],\\\\n ignoreKeys,\\\\n fullPath(pathPrefix, prop))) {\\\\n return false\\\\n }\\\\n }\\\\n }\\\\n for (var prop in o2) {\\\\n if (hOP(o2, prop) &&\\\\n !hOP(o1, prop) &&\\\\n !arrayInArray(fullPath(pathPrefix, prop), ignoreKeys)) {\\\\n return false\\\\n }\\\\n }\\\\n return true\\\\n }\\\",\\\"semver\\\":\\\"var expr = exports.expression = /^\\\\\\\\s*\\\\\\\\s*[v=]*\\\\\\\\s*([0-9]+)\\\\\\\\.([0-9]+)\\\\\\\\.([0-9]+)(-[0-9]+-?)?([a-zA-Z-][a-zA-Z0-9-.:]*)?\\\\\\\\s*$/\\\\nexports.valid = valid\\\\nexports.clean = clean\\\\nfunction valid(v) {\\\\n return v && typeof v === \\\\\\\"string\\\\\\\" && v.match(expr)\\\\n }\\\\nfunction clean(v) {\\\\n v = valid(v)\\\\n if (!v) return v\\\\n return [ v[1]||'0',\\\\n v[2]||'0',\\\\n v[3]||'0' ].join('.') +\\\\n (v[4]||'') +\\\\n (v[5]||'')\\\\n }\\\",\\\"valid\\\":\\\"var semver = require(\\\\\\\"semver\\\\\\\")\\\\nexports.name = validName\\\\nexports.package = validPackage\\\\nfunction validName(name) {\\\\n if (!name) return false\\\\n var n = name.trim()\\\\n if (!n || n.charAt(0) === \\\\\\\".\\\\\\\"\\\\n || n.match(/[\\\\\\\\/\\\\\\\\(\\\\\\\\)&\\\\\\\\?#\\\\\\\\|<>@:%\\\\\\\\s\\\\\\\\\\\\\\\\]/)\\\\n || n.toLowerCase() === \\\\\\\"node_modules\\\\\\\"\\\\n || n.toLowerCase() === \\\\\\\"favicon.ico\\\\\\\") {\\\\n return false\\\\n }\\\\n return n\\\\n }\\\\nfunction validPackage(pkg) {\\\\n return validName(pkg.name) && semver.valid(pkg.version)\\\\n }\\\",\\\"Date\\\":\\\"exports.parse = parse\\\\nexports.toISOString = toISOString\\\\nexports.now = now\\\\nfunction now() {\\\\n return new Date().getTime()\\\\n }\\\\nfunction parse(s) {\\\\n // s is something like \\\\\\\"2010-12-29T07:31:06Z\\\\\\\"\\\\n s = s.split(\\\\\\\"T\\\\\\\")\\\\n var ds = s[0]\\\\n , ts = s[1]\\\\n , d = new Date()\\\\n ds = ds.split(\\\\\\\"-\\\\\\\")\\\\n ts = ts.split(\\\\\\\":\\\\\\\")\\\\n var tz = ts[2].substr(2)\\\\n ts[2] = ts[2].substr(0, 2)\\\\n d.setUTCFullYear(+ds[0])\\\\n d.setUTCMonth(+ds[1]-1)\\\\n d.setUTCDate(+ds[2])\\\\n d.setUTCHours(+ts[0])\\\\n d.setUTCMinutes(+ts[1])\\\\n d.setUTCSeconds(+ts[2])\\\\n d.setUTCMilliseconds(0)\\\\n return d.getTime()\\\\n }\\\\nexports.toISOString = toISOString\\\\nfunction toISOString() { return ISODateString(this) }\\\\nfunction pad(n){return n<10 ? '0'+n : n}\\\\nfunction ISODateString(d){\\\\n return d.getUTCFullYear()+'-'\\\\n + pad(d.getUTCMonth()+1)+'-'\\\\n + pad(d.getUTCDate())+'T'\\\\n + pad(d.getUTCHours())+':'\\\\n + pad(d.getUTCMinutes())+':'\\\\n + pad(d.getUTCSeconds())+'Z'}\\\",\\\"Object\\\":\\\"exports.keys = keys\\\\nfunction keys(o) {\\\\n var a = []\\\\n for (var i in o) a.push(i)\\\\n return a }\\\",\\\"Array\\\":\\\"exports.isArray = isArray\\\\nexports.forEach = forEach\\\\n\\\\nexports.reduce = reduce\\\\n\\\\nfunction forEach(fn) {\\\\n for (var i = 0, l = this.length; i < l; i ++) {\\\\n if (this.hasOwnProperty(i)) {\\\\n fn(this[i], i, this)\\\\n }\\\\n }\\\\n }\\\\nfunction reduce(callback, initialValue) {\\\\n var previousValue = initialValue || this[0];\\\\n for (var i = initialValue ? 0 : 1; i < this.length; i++) {\\\\n previousValue = callback(previousValue, this[i], i, this);\\\\n }\\\\n return previousValue;\\\\n }\\\\nfunction isArray(a) {\\\\n return a instanceof Array\\\\n || Object.prototype.toString.call(a) === \\\\\\\"[object Array]\\\\\\\"\\\\n || (typeof a === \\\\\\\"object\\\\\\\" && typeof a.length === \\\\\\\"number\\\\\\\") }\\\",\\\"String\\\":\\\"exports.trim = trim\\\\nfunction trim() {\\\\n return this.replace(/^\\\\\\\\s+|\\\\\\\\s+$/g, \\\\\\\"\\\\\\\")\\\\n }\\\",\\\"monkeypatch\\\":\\\"exports.patch = patch\\\\nfunction patch(Object, Date, Array, String) {\\\\n if (!Date.parse || isNaN(Date.parse(\\\\\\\"2010-12-29T07:31:06Z\\\\\\\"))) {\\\\n Date.parse = require(\\\\\\\"Date\\\\\\\").parse\\\\n }\\\\n\\\\n Date.prototype.toISOString = Date.prototype.toISOString\\\\n || require(\\\\\\\"Date\\\\\\\").toISOString\\\\n\\\\n Date.now = Date.now\\\\n || require(\\\\\\\"Date\\\\\\\").now\\\\n\\\\n Object.keys = Object.keys\\\\n || require(\\\\\\\"Object\\\\\\\").keys\\\\n\\\\n Array.prototype.forEach = Array.prototype.forEach\\\\n || require(\\\\\\\"Array\\\\\\\").forEach\\\\n\\\\n Array.prototype.reduce = Array.prototype.reduce\\\\n || require(\\\\\\\"Array\\\\\\\").reduce\\\\n\\\\n Array.isArray = Array.isArray\\\\n || require(\\\\\\\"Array\\\\\\\").isArray\\\\n\\\\n String.prototype.trim = String.prototype.trim\\\\n || require(\\\\\\\"String\\\\\\\").trim\\\\n }\\\",\\\"attachments_md5\\\":{}}]\">>,\n 10]]},\n {couch_os_process,writeline,2},\n {couch_os_process,writejson,2},\n {couch_os_process,handle_call,3},\n {gen_server,handle_msg,5},\n {proc_lib,init_p_do_apply,3}]},\n {gen_server,call,\n [<0.22616.5>,\n {prompt,[<<\"ddoc\">>,<<\"new\">>,<<\"_design/scratch\">>,\n {[{<<\"_id\">>,<<\"_design/scratch\">>},\n {<<\"_rev\">>,<<\"1-442eb33d5d13cf14b070bba044a9764d\">>},\n {<<\"shows\">>,\n {[{<<\"package\">>,\n <<\"function (doc, req) {\\n require(\\\"monkeypatch\\\").patch(Object, Date, Array, String)\\n\\n var semver = require(\\\"semver\\\")\\n , code = 200\\n , headers = {\\\"Content-Type\\\":\\\"application/json\\\"}\\n , body = null\\n\\n delete doc.ctime\\n delete doc.mtime\\n if (doc.versions) Object.keys(doc.versions).forEach(function (v) {\\n delete doc.versions[v].ctime\\n delete doc.versions[v].mtime\\n })\\n\\n // legacy kludge\\n if (doc.versions) for (var v in doc.versions) {\\n var clean = semver.clean(v)\\n doc.versions[v].directories = doc.versions[v].directories || {}\\n if (clean !== v) {\\n var p = doc.versions[v]\\n delete doc.versions[v]\\n p.version = v = clean\\n doc.versions[clean] = p\\n }\\n if (doc.versions[v].dist.tarball) {\\n\\n // make it point at THIS registry that is being requested,\\n // with the full /db/_design/app/_rewrite if that is being used,\\n // or just the /name if not.\\n\\n var t = doc.versions[v].dist.tarball\\n t = t.replace(/^https?:\\\\/\\\\/[^\\\\/:]+(:[0-9]+)?/, '')\\n\\n var requestedPath = req.requested_path\\n // workaround for old couch versions that didn't\\n // have requested_path\\n if (requestedPath && -1 === requestedPath.indexOf('show'))\\n requestedPath = requestedPath.slice(0)\\n else {\\n var path = req.path\\n if (path) {\\n var i = path.indexOf('_show')\\n if (i !== -1) {\\n requestedPath = path.slice(0)\\n requestedPath.splice(i, i + 2, '_rewrite')\\n }\\n } else return {\\n code : 500,\\n body : JSON.stringify({error: 'bad couch'}),\\n headers : headers\\n }\\n }\\n\\n // doc.versions[v].dist._origTarball = doc.versions[v].dist.tarball\\n // doc.versions[v].dist._headers = req.headers\\n // doc.versions[v].dist._query = req.query\\n // doc.versions[v].dist._reqPath = req.requested_path\\n // doc.versions[v].dist._path = req.path\\n // doc.versions[v].dist._t = t.slice(0)\\n\\n // actual location of tarball should always be:\\n // .../_rewrite/pkg/-/pkg-version.tgz\\n // or: /pkg/-/pkg-version.tgz\\n // depending on what requested path is.\\n var tf = [doc.name, '-', t.split('/').pop()]\\n var i = requestedPath.indexOf('_rewrite')\\n if (i !== -1) {\\n tf = requestedPath.slice(0, i + 1).concat(tf)\\n }\\n t = '/' + tf.join('/')\\n var h = \\\"http://\\\" + req.headers.Host\\n\\n doc.versions[v].dist.tarball = h + t\\n }\\n }\\n if (doc[\\\"dist-tags\\\"]) for (var tag in doc[\\\"dist-tags\\\"]) {\\n var clean = semver.clean(doc[\\\"dist-tags\\\"][tag])\\n if (!clean) delete doc[\\\"dist-tags\\\"][tag]\\n else doc[\\\"dist-tags\\\"][tag] = clean\\n }\\n // end kludge\\n\\n if (req.query.version) {\\n var ver = req.query.version\\n // if not a valid version, then treat as a tag.\\n if ((!(ver in doc.versions) && (ver in doc[\\\"dist-tags\\\"]))\\n || !semver.valid(ver)) {\\n ver = doc[\\\"dist-tags\\\"][ver]\\n }\\n body = doc.versions[ver]\\n if (!body) {\\n code = 404\\n body = {\\\"error\\\" : \\\"version not found: \\\"+req.query.version}\\n }\\n } else {\\n body = doc\\n for (var i in body) if (i.charAt(0) === \\\"_\\\" && i !== \\\"_id\\\" && i !== \\\"_rev\\\") {\\n delete body[i]\\n }\\n for (var i in body.time) {\\n if (!body.versions[i]) delete body.time[i]\\n else body.time[i] = new Date(Date.parse(body.time[i])).toISOString()\\n }\\n }\\n\\n body = req.query.jsonp\\n ? req.query.jsonp + \\\"(\\\" + JSON.stringify(body) + \\\")\\\"\\n : toJSON(body)\\n\\n return {\\n code : code,\\n body : body,\\n headers : headers\\n }\\n}\">>}]}},\n {<<\"updates\">>,\n {[{<<\"package\">>,\n <<\"function (doc, req) {\\n require(\\\"monkeypatch\\\").patch(Object, Date, Array, String)\\n\\n var semver = require(\\\"semver\\\")\\n var valid = require(\\\"valid\\\")\\n function error (reason) {\\n return [{_id: \\\"error: forbidden\\\", forbidden:reason}, JSON.stringify({forbidden:reason})]\\n }\\n\\n function ok (doc, message) {\\n delete doc.mtime\\n delete doc.ctime\\n var time = doc.time = doc.time || {}\\n time.modified = (new Date()).toISOString()\\n time.created = time.created || time.modified\\n for (var v in doc.versions) {\\n var ver = doc.versions[v]\\n delete ver.ctime\\n delete ver.mtime\\n time[v] = time[v] || (new Date()).toISOString()\\n }\\n return [doc, JSON.stringify({ok:message})]\\n }\\n\\n if (doc) {\\n if (req.query.version) {\\n var parsed = semver.valid(req.query.version)\\n if (!parsed) {\\n // it's a tag.\\n var tag = req.query.version\\n , ver = JSON.parse(req.body)\\n if (!semver.valid(ver)) {\\n return error(\\\"setting tag \\\"+tag+\\\" to invalid version: \\\"+req.body)\\n }\\n doc[\\\"dist-tags\\\"][tag] = semver.clean(ver)\\n return ok(doc, \\\"updated tag\\\")\\n }\\n // adding a new version.\\n var ver = req.query.version\\n if (!semver.valid(ver)) {\\n return error(\\\"invalid version: \\\"+ver)\\n }\\n\\n if ((ver in doc.versions) || (semver.clean(ver) in doc.versions)) {\\n // attempting to overwrite an existing version.\\n // not supported at this time.\\n if (!req.query.rev || req.query.rev !== doc._rev) {\\n return error(\\\"cannot modify existing version\\\")\\n }\\n }\\n\\n var body = JSON.parse(req.body)\\n if (!valid.name(body.name)) {\\n return error( \\\"Invalid name: \\\"+JSON.stringify(body.name))\\n }\\n body.version = semver.clean(body.version)\\n ver = semver.clean(ver)\\n if (body.version !== ver) {\\n return error( \\\"version in doc doesn't match version in request: \\\"\\n + JSON.stringify(body.version)\\n + \\\" !== \\\" + JSON.stringify(ver) )\\n }\\n body._id = body.name + \\\"@\\\" + body.version\\n if (body.description) doc.description = body.description\\n if (body.author) doc.author = body.author\\n if (body.repository) doc.repository = body.repository\\n body.maintainers = doc.maintainers\\n\\n var tag = req.query.tag\\n || (body.publishConfig && body.publishConfig.tag)\\n || body.tag\\n || \\\"latest\\\"\\n\\n if (!req.query.pre) doc[\\\"dist-tags\\\"][tag] = body.version\\n doc.versions[ver] = body\\n doc.time = doc.time || {}\\n doc.time[ver] = (new Date()).toISOString()\\n return ok(doc, \\\"added version\\\")\\n }\\n\\n // update the package info\\n var newdoc = JSON.parse(req.body)\\n , changed = false\\n if (doc._rev && doc._rev !== newdoc._rev) {\\n return error( \\\"must supply latest _rev to update existing package\\\" )\\n }\\n for (var i in newdoc) if (typeof newdoc[i] === \\\"string\\\" || i === \\\"maintainers\\\") {\\n doc[i] = newdoc[i]\\n }\\n if (newdoc.versions) {\\n doc.versions = newdoc.versions\\n }\\n if (newdoc[\\\"dist-tags\\\"]) {\\n doc[\\\"dist-tags\\\"] = newdoc[\\\"dist-tags\\\"]\\n }\\n if (newdoc.users) {\\n if (!doc.users) doc.users = {}\\n doc.users[req.userCtx.name] = newdoc.users[req.userCtx.name]\\n }\\n return ok(doc, \\\"updated package metadata\\\")\\n } else {\\n // Create new package doc\\n doc = JSON.parse(req.body)\\n if (!doc._id) doc._id = doc.name\\n if (!doc.versions) doc.versions = {}\\n var latest\\n for (var v in doc.versions) {\\n if (!semver.valid(v)) return error(\\\"Invalid version: \\\"+JSON.stringify(v))\\n var p = doc.versions[v]\\n if (p.version !== v) return error(\\\"Version mismatch: \\\"+JSON.stringify(v)\\n +\\\" !== \\\"+JSON.stringify(p.version))\\n if (!valid.name(p.name)) return error(\\\"Invalid name: \\\"+JSON.stringify(p.name))\\n latest = semver.clean(v)\\n }\\n if (!doc['dist-tags']) doc['dist-tags'] = {}\\n if (latest) doc[\\\"dist-tags\\\"].latest = latest\\n return ok(doc, \\\"created new entry\\\")\\n }\\n}\">>}]}},\n {<<\"rewrites\">>,\n [{[{<<\"from\">>,<<\"/\">>},\n {<<\"to\">>,<<\"../../../registry\">>},\n {<<\"method\">>,<<\"GET\">>}]},\n {[{<<\"from\">>,<<\"/-/jsonp/:jsonp\">>},\n {<<\"to\">>,<<\"_list/short/listAll\">>},\n {<<\"method\">>,<<\"GET\">>}]},\n {[{<<\"from\">>,<<\"/_session\">>},\n {<<\"to\">>,<<\"../../../_session\">>},\n {<<\"method\">>,<<\"GET\">>}]},\n {[{<<\"from\">>,<<\"/_session\">>},\n {<<\"to\">>,<<\"../../../_session\">>},\n {<<\"method\">>,<<\"PUT\">>}]},\n {[{<<\"from\">>,<<\"/_session\">>},\n {<<\"to\">>,<<\"../../../_session\">>},\n {<<\"method\">>,<<\"POST\">>}]},\n {[{<<\"from\">>,<<\"/_session\">>},\n {<<\"to\">>,<<\"../../../_session\">>},\n {<<\"method\">>,<<\"DELETE\">>}]},\n {[{<<\"from\">>,<<\"/_session\">>},\n {<<\"to\">>,<<\"../../../_session\">>},\n {<<\"method\">>,<<\"HEAD\">>}]},\n {[{<<\"from\">>,<<\"/-/all/since\">>},\n {<<\"to\">>,<<\"_list/index/modified\">>},\n {<<\"method\">>,<<\"GET\">>}]},\n {[{<<\"from\">>,<<\"/-/rss\">>},\n {<<\"to\">>,<<\"_list/rss/modified\">>},\n {<<\"method\">>,<<\"GET\">>}]},\n {[{<<\"from\">>,<<\"/-/all\">>},\n {<<\"to\">>,<<\"_list/index/listAll\">>},\n {<<\"method\">>,<<\"GET\">>}]},\n {[{<<\"from\">>,<<\"/-/all/-/jsonp/:jsonp\">>},\n {<<\"to\">>,<<\"_list/index/listAll\">>},\n {<<\"method\">>,<<\"GET\">>}]},\n {[{<<\"from\">>,<<\"/-/short\">>},\n {<<\"to\">>,<<\"_list/short/listAll\">>},\n {<<\"method\">>,<<\"GET\">>}]},\n {[{<<\"from\">>,<<\"/-/scripts\">>},\n {<<\"to\">>,<<\"_list/scripts/scripts\">>},\n {<<\"method\">>,<<\"GET\">>}]},\n {[{<<\"from\">>,<<\"/-/by-field\">>},\n {<<\"to\">>,<<\"_list/byField/byField\">>},\n {<<\"method\">>,<<\"GET\">>}]},\n {[{<<\"from\">>,<<\"/-/fields\">>},\n {<<\"to\">>,<<\"_list/sortCount/fieldsInUse\">>},\n {<<\"method\">>,<<\"GET\">>},\n {<<\"query\">>,{[{<<\"group\">>,<<\"true\">>}]}}]},\n {[{<<\"from\">>,<<\"/-/needbuild\">>},\n {<<\"to\">>,<<\"_list/needBuild/needBuild\">>},\n {<<\"method\">>,<<\"GET\">>}]},\n {[{<<\"from\">>,<<\"/-/prebuilt\">>},\n {<<\"to\">>,<<\"_list/preBuilt/needBuild\">>},\n {<<\"method\">>,<<\"GET\">>}]},\n {[{<<\"from\">>,<<\"/-/nonlocal\">>},\n {<<\"to\">>,<<\"_list/short/nonlocal\">>},\n {<<\"method\">>,<<\"GET\">>}]},\n {[{<<\"from\">>,<<\"/favicon.ico\">>},\n {<<\"to\">>,<<\"../../npm/favicon.ico\">>},\n {<<\"method\">>,<<\"GET\">>}]},\n {[{<<\"from\">>,<<\"/-/users\">>},\n {<<\"to\">>,\n <<\"../../../_users/_design/_auth/_list/index/listAll\">>},\n {<<\"method\">>,<<\"GET\">>}]},\n {[{<<\"from\">>,<<\"/-/user/:user\">>},\n {<<\"to\">>,<<\"../../../_users/:user\">>},\n {<<\"method\">>,<<\"PUT\">>}]},\n {[{<<\"from\">>,<<\"/-/user/:user/-rev/:rev\">>},\n {<<\"to\">>,<<\"../../../_users/:user\">>},\n {<<\"method\">>,<<\"PUT\">>}]},\n {[{<<\"from\">>,<<\"/-/user/:user\">>},\n {<<\"to\">>,<<\"../../../_users/:user\">>},\n {<<\"method\">>,<<\"GET\">>}]},\n {[{<<\"from\">>,<<\"/_users/:user\">>},\n {<<\"to\">>,<<\"../../../_users/:user\">>},\n {<<\"method\">>,<<\"PUT\">>}]},\n {[{<<\"from\">>,<<\"/_users/:user\">>},\n {<<\"to\">>,<<\"../../../_users/:user\">>},\n {<<\"method\">>,<<\"GET\">>}]},\n {[{<<\"from\">>,<<\"/public_users/:user\">>},\n {<<\"to\">>,<<\"../../../public_users/:user\">>},\n {<<\"method\">>,<<\"PUT\">>}]},\n {[{<<\"from\">>,<<\"/public_users/:user\">>},\n {<<\"to\">>,<<\"../../../public_users/:user\">>},\n {<<\"method\">>,<<\"GET\">>}]},\n {[{<<\"from\">>,<<\"/-/user-by-email/:email\">>},\n {<<\"to\">>,\n <<\"../../../_users/_design/_auth/_list/email/listAll\">>},\n {<<\"method\">>,<<\"GET\">>}]},\n {[{<<\"from\">>,<<\"/-/top\">>},\n {<<\"to\">>,<<\"_view/npmTop\">>},\n {<<\"query\">>,{[{<<\"group_level\">>,1}]}},\n {<<\"method\">>,<<\"GET\">>}]},\n {[{<<\"from\">>,<<\"/-/by-user/:user\">>},\n {<<\"to\">>,<<\"_list/byUser/byUser\">>},\n {<<\"method\">>,<<\"GET\">>}]},\n {[{<<\"from\">>,<<\"/-/starred-by-user/:user\">>},\n {<<\"to\">>,<<\"_list/byUser/starredByUser\">>},\n {<<\"method\">>,<<\"GET\">>}]},\n {[{<<\"from\">>,<<\"/-/starred-by-package/:user\">>},\n {<<\"to\">>,<<\"_list/byUser/starredByPackage\">>},\n {<<\"method\">>,<<\"GET\">>}]},\n {[{<<\"from\">>,<<\"/:pkg\">>},\n {<<\"to\">>,<<\"/_show/package/:pkg\">>},\n {<<\"method\">>,<<\"GET\">>}]},\n {[{<<\"from\">>,<<\"/:pkg/-/jsonp/:jsonp\">>},\n {<<\"to\">>,<<\"/_show/package/:pkg\">>},\n {<<\"method\">>,<<\"GET\">>}]},\n {[{<<\"from\">>,<<\"/:pkg/:version\">>},\n {<<\"to\">>,<<\"_show/package/:pkg\">>},\n {<<\"method\">>,<<\"GET\">>}]},\n {[{<<\"from\">>,<<\"/:pkg/:version/-/jsonp/:jsonp\">>},\n {<<\"to\">>,<<\"_show/package/:pkg\">>},\n {<<\"method\">>,<<\"GET\">>}]},\n {[{<<\"from\">>,<<\"/:pkg/-/:att\">>},\n {<<\"to\">>,<<\"../../:pkg/:att\">>},\n {<<\"method\">>,<<\"GET\">>}]},\n {[{<<\"from\">>,<<\"/:pkg/-/:att/:rev\">>},\n {<<\"to\">>,<<\"../../:pkg/:att\">>},\n {<<\"method\">>,<<\"PUT\">>}]},\n {[{<<\"from\">>,<<\"/:pkg/-/:att/-rev/:rev\">>},\n {<<\"to\">>,<<\"../../:pkg/:att\">>},\n {<<\"method\">>,<<\"PUT\">>}]},\n {[{<<\"from\">>,<<\"/:pkg/-/:att/:rev\">>},\n {<<\"to\">>,<<\"../../:pkg/:att\">>},\n {<<\"method\">>,<<\"DELETE\">>}]},\n {[{<<\"from\">>,<<\"/:pkg/-/:att/-rev/:rev\">>},\n {<<\"to\">>,<<\"../../:pkg/:att\">>},\n {<<\"method\">>,<<\"DELETE\">>}]},\n {[{<<\"from\">>,<<\"/:pkg\">>},\n {<<\"to\">>,<<\"/_update/package/:pkg\">>},\n {<<\"method\">>,<<\"PUT\">>}]},\n {[{<<\"from\">>,<<\"/:pkg/-rev/:rev\">>},\n {<<\"to\">>,<<\"/_update/package/:pkg\">>},\n {<<\"method\">>,<<\"PUT\">>}]},\n {[{<<\"from\">>,<<\"/:pkg/:version\">>},\n {<<\"to\">>,<<\"_update/package/:pkg\">>},\n {<<\"method\">>,<<\"PUT\">>}]},\n {[{<<\"from\">>,<<\"/:pkg/:version/-rev/:rev\">>},\n {<<\"to\">>,<<\"_update/package/:pkg\">>},\n {<<\"method\">>,<<\"PUT\">>}]},\n {[{<<\"from\">>,<<\"/:pkg/:version/-tag/:tag\">>},\n {<<\"to\">>,<<\"_update/package/:pkg\">>},\n {<<\"method\">>,<<\"PUT\">>}]},\n {[{<<\"from\">>,\n <<\"/:pkg/:version/-tag/:tag/-rev/:rev\">>},\n {<<\"to\">>,<<\"_update/package/:pkg\">>},\n {<<\"method\">>,<<\"PUT\">>}]},\n {[{<<\"from\">>,<<\"/:pkg/:version/-pre/:pre\">>},\n {<<\"to\">>,<<\"_update/package/:pkg\">>},\n {<<\"method\">>,<<\"PUT\">>}]},\n {[{<<\"from\">>,\n <<\"/:pkg/:version/-pre/:pre/-rev/:rev\">>},\n {<<\"to\">>,<<\"_update/package/:pkg\">>},\n {<<\"method\">>,<<\"PUT\">>}]},\n {[{<<\"from\">>,<<\"/:pkg/-rev/:rev\">>},\n {<<\"to\">>,<<\"../../:pkg\">>},\n {<<\"method\">>,<<\"DELETE\">>}]},\n {[{<<\"from\">>,<<\"/-/_view/*\">>},\n {<<\"to\">>,<<\"_view/*\">>},\n {<<\"method\">>,<<\"GET\">>}]},\n {[{<<\"from\">>,<<\"/-/_list/*\">>},\n {<<\"to\">>,<<\"_list/*\">>},\n {<<\"method\">>,<<\"GET\">>}]},\n {[{<<\"from\">>,<<\"/-/_show/*\">>},\n {<<\"to\">>,<<\"_show/*\">>},\n {<<\"method\">>,<<\"GET\">>}]}]},\n {<<\"views\">>,\n {[{<<\"updated\">>,\n {[{<<\"map\">>,\n <<\"function (doc) {\\n var l = doc[\\\"dist-tags\\\"].latest\\n , t = doc.time && doc.time[l]\\n if (t) emit(t, 1)\\n}\">>}]}},\n {<<\"listAll\">>,\n {[{<<\"map\">>,\n <<\"function (doc) { return emit(doc._id, doc) }\">>}]}},\n {<<\"modified\">>,\n {[{<<\"map\">>,\n <<\"function (doc) {\\n if (!doc.versions) return\\n var latest = doc[\\\"dist-tags\\\"].latest\\n if (!doc.versions[latest]) return\\n var time = doc.time && doc.time[latest] || 0\\n var t = new Date(time)\\n emit(t.getTime(), doc)\\n}\">>}]}},\n {<<\"byEngine\">>,\n {[{<<\"map\">>,\n <<\"function (doc) {\\n if (!doc || !doc.versions || !doc[\\\"dist-tags\\\"]) return\\n var v = doc[\\\"dist-tags\\\"].latest\\n var d = doc.versions[v]\\n if (d && d.engines) emit(doc._id, [d.engines, doc.maintainers])\\n }\">>}]}},\n {<<\"countVersions\">>,\n {[{<<\"map\">>,\n <<\"function (doc) {\\n if (!doc || !doc.name) return\\n var i = 0\\n if (!doc.versions) return emit([i, doc._id], 1)\\n for (var v in doc.versions) i++\\n emit([i, doc._id], 1)\\n}\">>},\n {<<\"reduce\">>,<<\"_sum\">>}]}},\n {<<\"byKeyword\">>,\n {[{<<\"map\">>,\n <<\"function (doc) {\\n if (!doc || !doc.versions || !doc['dist-tags']) return\\n var v = doc.versions[doc['dist-tags'].latest]\\n if (!v || !v.keywords || !Array.isArray(v.keywords)) return\\n v.keywords.forEach(function (kw) {\\n emit([kw.toLowerCase(), doc.name, doc.description], 1)\\n })\\n }\">>},\n {<<\"reduce\">>,<<\"_sum\">>}]}},\n {<<\"byField\">>,\n {[{<<\"map\">>,\n <<\"function (doc) {\\n if (!doc || !doc.versions || !doc[\\\"dist-tags\\\"]) return\\n var v = doc[\\\"dist-tags\\\"].latest\\n //Object.keys(doc.versions).forEach(function (v) {\\n var d = doc.versions[v]\\n if (!d) return\\n //emit(d.name + \\\"@\\\" + d.version, d.dist.bin || {})\\n var out = {}\\n for (var i in d) {\\n out[i] = d[i] //true\\n if (d[i] && typeof d[i] === \\\"object\\\" &&\\n (i === \\\"scripts\\\" || i === \\\"directories\\\")) {\\n for (var j in d[i]) out[i + \\\".\\\" + j] = d[i][j]\\n }\\n }\\n out.maintainers = doc.maintainers\\n emit(doc._id, out)\\n //})\\n }\">>}]}},\n {<<\"needBuild\">>,\n {[{<<\"map\">>,\n <<\"function (doc) {\\n\\n if (!doc || !doc.versions || !doc[\\\"dist-tags\\\"]) return\\n var v = doc[\\\"dist-tags\\\"].latest\\n //Object.keys(doc.versions).forEach(function (v) {\\n var d = doc.versions[v]\\n if (!d) return\\n if (!d.scripts) return\\n var inst = d.scripts.install\\n || d.scripts.preinstall\\n || d.scripts.postinstall\\n if (!inst) return\\n //emit(d.name + \\\"@\\\" + d.version, d.dist.bin || {})\\n emit(d._id, d.dist.bin || {})\\n //})\\n }\">>}]}},\n {<<\"scripts\">>,\n {[{<<\"map\">>,\n <<\"function (doc) {\\n if (!doc || !doc.versions || !doc[\\\"dist-tags\\\"]) return\\n var v = doc[\\\"dist-tags\\\"].latest\\n if (!doc.versions[v]) return\\n if (!doc.versions[v].scripts) return\\n emit(doc._id, doc.versions[v].scripts)\\n }\">>}]}},\n {<<\"nodeWafInstall\">>,\n {[{<<\"map\">>,\n <<\"function (doc) {\\n if (!doc || !doc.versions || !doc[\\\"dist-tags\\\"]) return\\n var v = doc[\\\"dist-tags\\\"].latest\\n if (!doc.versions[v]) return\\n if (!doc.versions[v].scripts) return\\n for (var i in doc.versions[v].scripts) {\\n if (doc.versions[v].scripts[i].indexOf(\\\"node-waf\\\") !== -1 ||\\n doc.versions[v].scripts[i].indexOf(\\\"make\\\") !== -1) {\\n emit(doc._id, doc.versions[v]._id)\\n return\\n }\\n }\\n }\">>}]}},\n {<<\"badBins\">>,\n {[{<<\"map\">>,\n <<\"function (doc) {\\n if (!doc || !doc.versions || !doc[\\\"dist-tags\\\"]) return\\n var v = doc[\\\"dist-tags\\\"].latest\\n if (!doc.versions[v]) return\\n v = doc.versions[v]\\n var b = v.bin\\n , d = v.directories && v.directories.bin\\n if (!b && !d) return\\n if (b && (typeof b === \\\"string\\\" || Object.keys(b).length === 1)) {\\n // it's ok.\\n return\\n }\\n emit(doc._id, {binHash:b, binDir:d})\\n }\">>}]}},\n {<<\"orphanAttachments\">>,\n {[{<<\"map\">>,\n <<\"function (doc) {\\n if (!doc || !doc._attachments) return\\n var orphans = []\\n , size = 0\\n for (var i in doc._attachments) {\\n var n = i.substr(doc._id.length + 1).replace(/\\\\.tgz$/, \\\"\\\")\\n .replace(/^v/, \\\"\\\")\\n if (!doc.versions[n] && i.match(/\\\\.tgz$/)) {\\n orphans.push(i)\\n size += doc._attachments[i].length\\n }\\n }\\n if (orphans.length) emit(doc._id, {size:size, orphans:orphans})\\n }\">>}]}},\n {<<\"starredByUser\">>,\n {[{<<\"map\">>,\n <<\"function (doc) {\\n if (!doc || !doc.users) return\\n Object.keys(doc.users).forEach(function (m) {\\n if (!doc.users[m]) return\\n emit(m, doc._id)\\n })\\n}\">>}]}},\n {<<\"starredByPackage\">>,\n {[{<<\"map\">>,\n <<\"function (doc) {\\n if (!doc || !doc.users) return\\n Object.keys(doc.users).forEach(function (m) {\\n if (!doc.users[m]) return\\n emit(doc._id, m)\\n })\\n}\">>}]}},\n {<<\"byUser\">>,\n {[{<<\"map\">>,\n <<\"function (doc) {\\n if (!doc || !doc.maintainers) return\\n doc.maintainers.forEach(function (m) {\\n emit(m.name, doc._id)\\n })\\n}\">>}]}},\n {<<\"npmTop\">>,\n {[{<<\"map\">>,\n <<\"function (doc) {\\n if (!doc || !doc.maintainers) return\\n var l = doc['dist-tags'] && doc['dist-tags'].latest\\n l = l && doc.versions && doc.versions[l]\\n if (!l) return\\n var desc = doc.description || l.description || ''\\n var readme = doc.readme || l.readme || ''\\n doc.maintainers.forEach(function (m) {\\n emit([m.name, doc._id, desc, readme], 1)\\n })\\n}\">>},\n {<<\"reduce\">>,<<\"_sum\">>}]}},\n {<<\"browseAuthors\">>,\n {[{<<\"map\">>,\n <<\"function (doc) {\\n if (!doc || !doc.maintainers) return\\n var l = doc['dist-tags'] && doc['dist-tags'].latest\\n l = l && doc.versions && doc.versions[l]\\n if (!l) return\\n var desc = doc.description || l.description || ''\\n var readme = doc.readme || l.readme || ''\\n doc.maintainers.forEach(function (m) {\\n emit([m.name, doc._id, desc, readme], 1)\\n })\\n}\">>},\n {<<\"reduce\">>,<<\"_sum\">>}]}},\n {<<\"browseUpdated\">>,\n {[{<<\"map\">>,\n <<\"function (doc) {\\n if (!doc || !doc.versions) return\\n var l = doc['dist-tags'] && doc['dist-tags'].latest\\n if (!l) return\\n var t = doc.time && doc.time[l]\\n if (!t) return\\n var v = doc.versions[l]\\n if (!v) return\\n var d = new Date(t)\\n if (!d.getTime()) return\\n emit([ d.toISOString(),\\n doc._id,\\n v.description,\\n v.readme ], 1)\\n}\">>},\n {<<\"reduce\">>,<<\"_sum\">>}]}},\n {<<\"browseAll\">>,\n {[{<<\"map\">>,\n <<\"function (doc) {\\n if (!doc || !doc.versions) return\\n var l = doc['dist-tags'] && doc['dist-tags'].latest\\n if (!l) return\\n l = doc.versions && doc.versions[l]\\n if (!l) return\\n var desc = doc.description || l.description || ''\\n var readme = doc.readme || l.readme || ''\\n emit([doc.name, desc, readme], 1)\\n}\">>},\n {<<\"reduce\">>,<<\"_sum\">>}]}},\n {<<\"analytics\">>,\n {[{<<\"map\">>,\n <<\"function (doc) {\\n if (!doc || !doc.time) return\\n for (var i in doc.time) {\\n var t = doc.time[i]\\n var d = new Date(t)\\n if (!d.getTime()) return\\n var type = i === 'modified' ? 'latest'\\n : i === 'created' ? 'created'\\n : 'update'\\n emit([ type,\\n d.getUTCFullYear(),\\n d.getUTCMonth() + 1,\\n d.getUTCDate(),\\n doc._id ], 1)\\n }\\n}\">>},\n {<<\"reduce\">>,<<\"_sum\">>}]}},\n {<<\"dependedUpon\">>,\n {[{<<\"map\">>,\n <<\"function (doc) {\\n if (!doc) return\\n var l = doc['dist-tags'] && doc['dist-tags'].latest\\n if (!l) return\\n l = doc.versions && doc.versions[l]\\n if (!l) return\\n var desc = doc.description || l.description || ''\\n var readme = doc.readme || l.readme || ''\\n var d = l.dependencies\\n if (!d) return\\n for (var dep in d) {\\n emit([dep, doc._id, desc, readme], 1)\\n }\\n}\">>},\n {<<\"reduce\">>,<<\"_sum\">>}]}},\n {<<\"browseStarUser\">>,\n {[{<<\"map\">>,\n <<\"function (doc) {\\n if (!doc) return\\n var l = doc['dist-tags'] && doc['dist-tags'].latest\\n if (!l) return\\n l = doc.versions && doc.versions[l]\\n if (!l) return\\n var desc = doc.description || l.description || ''\\n var readme = doc.readme || l.readme || ''\\n var d = doc.users\\n if (!d) return\\n for (var user in d) {\\n emit([user, doc._id, desc, readme], 1)\\n }\\n}\">>},\n {<<\"reduce\">>,<<\"_sum\">>}]}},\n {<<\"browseStarPackage\">>,\n {[{<<\"map\">>,\n <<\"function (doc) {\\n if (!doc) return\\n var l = doc['dist-tags'] && doc['dist-tags'].latest\\n if (!l) return\\n l = doc.versions && doc.versions[l]\\n if (!l) return\\n var desc = doc.description || l.description || ''\\n var readme = doc.readme || l.readme || ''\\n var d = doc.users\\n if (!d) return\\n for (var user in d) {\\n emit([doc._id, desc, user, readme], 1)\\n }\\n}\">>},\n {<<\"reduce\">>,<<\"_sum\">>}]}},\n {<<\"fieldsInUse\">>,\n {[{<<\"map\">>,\n <<\"function (doc) {\\n if (!doc.versions || !doc[\\\"dist-tags\\\"] || !doc[\\\"dist-tags\\\"].latest) {\\n return\\n }\\n var d = doc.versions[doc[\\\"dist-tags\\\"].latest]\\n if (!d) return\\n for (var f in d) {\\n emit(f, 1)\\n if (d[f] && typeof d[f] === \\\"object\\\" &&\\n (f === \\\"scripts\\\" || f === \\\"directories\\\")) {\\n for (var i in d[f]) emit(f+\\\".\\\"+i, 1)\\n }\\n }\\n}\">>},\n {<<\"reduce\">>,<<\"_sum\">>}]}},\n {<<\"howBigIsYourPackage\">>,\n {[{<<\"map\">>,\n <<\"function (doc) {\\n var s = 0\\n , c = 0\\n if (!doc) return\\n for (var i in doc._attachments) {\\n s += doc._attachments[i].length\\n c ++\\n }\\n if (s === 0) return\\n emit(doc._id, {_id: doc._id, size: s, count: c, avg: s/c})\\n }\">>}]}}]}},\n {<<\"lists\">>,\n {[{<<\"first\">>,\n <<\"function (head, req) {\\n var row = getRow()\\n send(toJSON([row, row.id, row.doc]))\\n}\">>},\n {<<\"short\">>,\n <<\"function (head, req) {\\n require(\\\"monkeypatch\\\").patch(Object, Date, Array, String)\\n\\n var out = {}\\n , row\\n , show = (req.query.show || \\\"\\\").split(\\\",\\\")\\n , v = show.indexOf(\\\"version\\\") !== -1\\n , t = show.indexOf(\\\"tag\\\") !== -1\\n while (row = getRow()) {\\n if (!row.id) continue\\n if (!t && !v) {\\n out[row.id] = true\\n continue\\n }\\n var val = row.value\\n if (t) Object.keys(val[\\\"dist-tags\\\"] || {}).forEach(function (t) {\\n out[row.id + \\\"@\\\" + t] = true\\n })\\n if (v) Object.keys(val.versions || {}).forEach(function (v) {\\n out[row.id + \\\"@\\\" + v] = true\\n })\\n }\\n send(toJSON(Object.keys(out)))\\n}\">>},\n {<<\"rss\">>,\n <<\"function (head, req) {\\n var limit = +req.query.limit\\n , desc = req.query.descending\\n if (!desc || !limit || limit > 50 || limit < 0) {\\n start({ code: 403\\n , headers: { 'Content-type': 'text/xml' }})\\n send('<error><![CDATA[Please retry your request with '\\n + '?descending=true&limit=50 query params]]></error>')\\n return\\n }\\n\\n start({ code: 200\\n // application/rss+xml is correcter, but also annoyinger\\n , headers: { \\\"Content-Type\\\": \\\"text/xml\\\" } })\\n send('<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>'\\n +'\\\\n<!DOCTYPE rss PUBLIC \\\"-//Netscape Communications//DTD RSS 0.91//EN\\\" '\\n +'\\\"http://my.netscape.com/publish/formats/rss-0.91.dtd\\\">'\\n +'\\\\n<rss version=\\\"0.91\\\">'\\n +'\\\\n <channel>'\\n +'\\\\n <title>npm recent updates</title>'\\n +'\\\\n <link>http://search.npmjs.org/</link>'\\n +'\\\\n <description>Updates to the npm package registry</description>'\\n +'\\\\n <language>en</language>')\\n\\n var row\\n while (row = getRow()) {\\n if (!row.value || !row.value[\\\"dist-tags\\\"]) continue\\n\\n var doc = row.value\\n var authors = doc.maintainers.map(function (m) {\\n return '<author>' + m.name + '</author>'\\n }).join('\\\\n ')\\n\\n var latest = doc[\\\"dist-tags\\\"].latest\\n var time = doc.time && doc.time[latest]\\n var date = new Date(time)\\n doc = doc.versions[latest]\\n if (!doc || !time || !date) continue\\n\\n var url = doc.homepage\\n , repo = doc.repository || doc.repositories\\n if (!url && repo) {\\n if (Array.isArray(repo)) repo = repo.shift()\\n if (repo.url) repo = repo.url\\n if (repo && (typeof repo === \\\"string\\\")) {\\n url = repo.replace(/^git(@|:\\\\/\\\\/)/, 'http://')\\n .replace(/\\\\.git$/, '')+\\\"#readme\\\"\\n }\\n }\\n if (!url) url = \\\"http://search.npmjs.org/#/\\\" + doc.name\\n\\n send('\\\\n <item>'\\n +'\\\\n <title>' + doc._id + '</title>'\\n +'\\\\n <link>' + url + '</link>'\\n +'\\\\n ' + authors\\n +'\\\\n <description><![CDATA['\\n + (doc.description || '').trim() + ']]></description>'\\n +'\\\\n <pubDate>' + date.toISOString() + '</pubDate>'\\n +'\\\\n </item>')\\n }\\n send('\\\\n </channel>'\\n +'\\\\n</rss>')\\n}\">>},\n {<<\"index\">>,\n <<\"function (head, req) {\\n require(\\\"monkeypatch\\\").patch(Object, Date, Array, String)\\n var basePath = req.requested_path\\n if (basePath.indexOf(\\\"_list\\\") === -1) basePath = \\\"\\\"\\n else {\\n basePath = basePath.slice(0, basePath.indexOf(\\\"_list\\\"))\\n .concat([\\\"_rewrite\\\", \\\"\\\"]).join(\\\"/\\\")\\n }\\n\\n var row\\n , semver = require(\\\"semver\\\")\\n , res = []\\n\\n if (req.query.jsonp) send(req.query.jsonp + \\\"(\\\")\\n send('{\\\"_updated\\\":' + Date.now())\\n while (row = getRow()) {\\n if (!row.id) continue\\n\\n var doc = row.value\\n if (!doc.name || !doc._id ||\\n encodeURIComponent(doc._id) !== doc._id) continue\\n\\n var p = {}\\n\\n // legacy kludge\\n delete doc.mtime\\n delete doc.ctime\\n if (doc.versions) for (var v in doc.versions) {\\n var clean = semver.clean(v)\\n delete doc.versions[v].ctime\\n delete doc.versions[v].mtime\\n if (clean !== v) {\\n var x = doc.versions[v]\\n delete doc.versions[v]\\n x.version = v = clean\\n doc.versions[clean] = x\\n }\\n }\\n if (doc[\\\"dist-tags\\\"]) for (var tag in doc[\\\"dist-tags\\\"]) {\\n var clean = semver.clean(doc[\\\"dist-tags\\\"][tag])\\n if (!clean) delete doc[\\\"dist-tags\\\"][tag]\\n else doc[\\\"dist-tags\\\"][tag] = clean\\n }\\n // end kludge\\n\\n for (var i in doc) {\\n if (i === \\\"versions\\\" || i.charAt(0) === \\\"_\\\" || i === 'readme' ||\\n i === 'time') continue\\n p[i] = doc[i]\\n }\\n if (doc.time) {\\n p.time = { modified: doc.time.modified }\\n }\\n if (p['dist-tags'] && typeof p['dist-tags'] === 'object') {\\n p.versions = Object.keys(p['dist-tags']).reduce(function (ac, v) {\\n ac[ p['dist-tags'][v] ] = v\\n return ac\\n }, {})\\n }\\n if (doc.repositories && Array.isArray(doc.repositories)) {\\n doc.repository = doc.repositories[0]\\n delete doc.repositories\\n }\\n if (doc.repository) p.repository = doc.repository\\n if (doc.description) p.description = doc.description\\n for (var i in doc.versions) {\\n if (doc.versions[i].repository && !doc.repository) {\\n p.repository = doc.versions[i].repository\\n }\\n if (doc.versions[i].keywords) p.keywords = doc.versions[i].keywords\\n }\\n send(',' + JSON.stringify(doc._id) + ':' + JSON.stringify(p))\\n }\\n send('}')\\n if (req.query.jsonp) send(')')\\n\\n}\">>},\n {<<\"byField\">>,\n <<\"function (head, req) {\\n require(\\\"monkeypatch\\\").patch(Object, Date, Array, String)\\n\\n if (!req.query.field) {\\n start({\\\"code\\\":\\\"400\\\", \\\"headers\\\": {\\\"Content-Type\\\": \\\"application/json\\\"}})\\n send('{\\\"error\\\":\\\"Please specify a field parameter\\\"}')\\n return\\n }\\n\\n start({\\\"code\\\": 200, \\\"headers\\\": {\\\"Content-Type\\\": \\\"application/json\\\"}})\\n var row\\n , out = {}\\n , field = req.query.field\\n , not = field.charAt(0) === \\\"!\\\"\\n if (not) field = field.substr(1)\\n while (row = getRow()) {\\n if (!row.id) continue\\n var has = row.value.hasOwnProperty(field)\\n if (!not && !has || not && has) continue\\n out[row.key] = { \\\"maintainers\\\": row.value.maintainers.map(function (m) {\\n return m.name + \\\" <\\\" + m.email + \\\">\\\"\\n }) }\\n if (has) out[row.key][field] = row.value[field]\\n }\\n send(JSON.stringify(out))\\n}\">>},\n {<<\"preBuilt\">>,\n <<\"function (head, req) {\\n start({\\\"code\\\": 200, \\\"headers\\\": {\\\"Content-Type\\\": \\\"text/plain\\\"}});\\n var row\\n , out = []\\n while (row = getRow()) {\\n if (!row.id) continue\\n if (!(req.query.bindist && row.value[req.query.bindist])) continue\\n out.push(row.key)\\n }\\n send(out.join(\\\"\\\\n\\\"))\\n}\">>},\n {<<\"needBuild\">>,\n <<\"function (head, req) {\\n start({\\\"code\\\": 200, \\\"headers\\\": {\\\"Content-Type\\\": \\\"text/plain\\\"}});\\n var row\\n , first = true\\n while (row = getRow()) {\\n if (!row.id) continue\\n if (req.query.bindist && row.value[req.query.bindist]) continue\\n // out.push(row.key)\\n send((first ? \\\"{\\\" : \\\",\\\")\\n + JSON.stringify(row.key)\\n + \\\":\\\"\\n + JSON.stringify(Object.keys(row.value))\\n + \\\"\\\\n\\\")\\n first = false\\n }\\n send(\\\"}\\\\n\\\")\\n}\">>},\n {<<\"scripts\">>,\n <<\"function (head, req) {\\n var row\\n , out = {}\\n , scripts = req.query.scripts && req.query.scripts.split(\\\",\\\")\\n , match = req.query.match\\n\\n if (match) match = new RegExp(match)\\n\\n while (row = getRow()) {\\n inc = true\\n if (!row.id) continue\\n if (req.query.package && row.id !== req.query.package) continue\\n if (scripts && scripts.length) {\\n var inc = false\\n for (var s = 0, l = scripts.length; s < l && !inc; s ++) {\\n inc = row.value[scripts[s]]\\n if (match) inc = inc && row.value[scripts[s]].match(match)\\n }\\n if (!inc) continue\\n }\\n out[row.id] = row.value\\n }\\n send(toJSON(out))\\n}\">>},\n {<<\"rowdump\">>,\n <<\"function (head, req) {\\n var rows = []\\n while (row = getRow()) rows.push(row)\\n send(toJSON(rows))\\n}\">>},\n {<<\"passthrough\">>,\n <<\"function (head, req) {\\n var out = {}\\n , row\\n while (row = getRow()) {\\n if (!row.id) continue\\n out[row.id] = row.value\\n }\\n send(toJSON(out))\\n}\">>},\n {<<\"byUser\">>,\n <<\"function (head, req) {\\n var out = {}\\n , user = req.query.user && req.query.user !== \\\"-\\\" ? req.query.user : null\\n , users = user && user.split(\\\"|\\\")\\n while (row = getRow()) {\\n if (!user || users.indexOf(row.key) !== -1) {\\n var l = out[row.key] = out[row.key] || []\\n l.push(row.value)\\n }\\n }\\n send(toJSON(out))\\n}\">>},\n {<<\"sortCount\">>,\n <<\"function (head, req) {\\n var out = []\\n while (row = getRow()) {\\n out.push([row.key, row.value])\\n }\\n out = out.sort(function (a, b) {\\n return a[1] === b[1] ? 0\\n : a[1] < b[1] ? 1 : -1\\n })\\n var outObj = {}\\n for (var i = 0, l = out.length; i < l; i ++) {\\n outObj[out[i][0]] = out[i][1]\\n }\\n send(toJSON(outObj))\\n}\">>},\n {<<\"size\">>,\n <<\"function (head, req) {\\n var row\\n , out = []\\n , max = 0\\n while (row = getRow()) {\\n if (!row.id) continue\\n out.push(row.value)\\n }\\n var list = []\\n out = out.sort(function (a, b) {\\n max = Math.max(max, a.size, b.size)\\n return a.size > b.size ? -1 : 1\\n })\\n .reduce(function (l, r) {\\n var stars = new Array(Math.ceil(80 * (r.size/max)) + 1).join(\\\"\\\\u25FE\\\")\\n l[r._id] = { size: r.size\\n , count: r.count\\n , avg: r.avg\\n , rel: r.size / max\\n , s: stars\\n }\\n return l\\n }, {})\\n send(JSON.stringify(out))\\n}\">>},\n {<<\"histogram\">>,\n <<\"function (head, req) {\\n require(\\\"monkeypatch\\\").patch(Object, Date, Array, String)\\n start({\\\"code\\\": 200, \\\"headers\\\": {\\\"Content-Type\\\": \\\"text/plain\\\"}});\\n var row\\n , out = []\\n , max = {}\\n , field = req.query.field\\n , sort = req.query.sort\\n , doAll = !field\\n\\n while (row = getRow()) {\\n if (!row.id) continue\\n out.push(row.value)\\n }\\n\\n if (!doAll) out.sort(function (a, b) {\\n max[field] = Math.max(max[field] || -Infinity, a[field], b[field])\\n return a[field] > b[field] ? -1 : 1\\n })\\n else out.sort(function (a, b) {\\n for (var field in a) if (field.charAt(0) !== \\\"_\\\" && !isNaN(a[field])) {\\n max[field] = Math.max(max[field] || -Infinity, a[field])\\n }\\n for (var field in b) if (field.charAt(0) !== \\\"_\\\" && !isNaN(b[field])) {\\n max[field] = Math.max(max[field] || -Infinity, b[field])\\n }\\n if (sort) {\\n return Number(a[sort]) > Number(b[sort]) ? -1 : 1\\n } else {\\n return 0\\n }\\n })\\n if (doAll) {\\n // sort the fields by the max sizes.\\n var m = {}\\n Object.keys(max).sort(function (a, b) {\\n return max[a] > max[b] ? -1 : 1\\n }).forEach(function (k) { m[k] = max[k] })\\n max = m\\n }\\n out = out.map(function (a) {\\n var o = {}\\n for (var f in max) {\\n var blk = new Array(Math.ceil(80*(a[f] / max[f])+1)).join(\\\"#\\\")\\n , spc = new Array(80 - blk.length + 1).join(\\\" \\\")\\n o[f] = spc + blk + \\\" \\\" + a[f]\\n }\\n o._id = a._id\\n return o\\n }).reduce(function (l, r) {\\n l[r._id] = r\\n return l\\n }, {})\\n\\n var spc = new Array(82).join(\\\" \\\")\\n send(Object.keys(out).map(function (i) {\\n if (doAll) return [spc + i].concat(Object.keys(max).map(function (f) {\\n return out[i][f] + \\\" \\\" + f\\n })).join(\\\"\\\\n\\\") + \\\"\\\\n\\\"\\n return out[i][field] + \\\" \\\" + i\\n }).join(\\\"\\\\n\\\"))\\n}\">>}]}},\n {<<\"validate_doc_update\">>,\n <<\"function (doc, oldDoc, user, dbCtx) {\\n // can't write to the db without logging in.\\n if (!user || !user.name) {\\n throw { unauthorized: \\\"Please log in before writing to the db\\\" }\\n }\\n\\n require(\\\"monkeypatch\\\").patch(Object, Date, Array, String)\\n\\n var semver = require(\\\"semver\\\")\\n var valid = require(\\\"valid\\\")\\n var deep = require(\\\"deep\\\")\\n var deepEquals = deep.deepEquals\\n\\n\\n if (oldDoc) oldDoc.users = oldDoc.users || {}\\n doc.users = doc.users || {}\\n\\n\\n function assert (ok, message) {\\n if (!ok) throw {forbidden:message}\\n }\\n\\n // admins can do ANYTHING (even break stuff)\\n if (isAdmin()) return\\n\\n // figure out what changed in the doc.\\n function diffObj (o, n, p) {\\n p = p || \\\"\\\"\\n var d = []\\n var seenKeys = []\\n for (var i in o) {\\n seenKeys.push(i)\\n if (!(i in n)) {\\n d.push(\\\"Deleted: \\\"+p+i)\\n }\\n if (typeof o[i] !== typeof n[i]) {\\n d.push(\\\"Changed Type: \\\"+p+i)\\n }\\n if (typeof o[i] === \\\"object\\\" && o[i] && !n[i]) {\\n d.push(\\\"Nulled: \\\"+p+i)\\n }\\n if (typeof o[i] === \\\"object\\\" && !o[i] && n[i]) {\\n d.push(\\\"Un-nulled: \\\"+p+i)\\n }\\n if (typeof o[i] === \\\"object\\\") {\\n d = d.concat(diffObj(o[i], n[i], p + i + \\\".\\\"))\\n } else {\\n if (o[i] !== n[i]) {\\n d.push(\\\"Changed: \\\"+p+i+\\\" \\\"+JSON.stringify(o[i]) + \\\" -> \\\"\\n +JSON.stringify(n[i]))\\n }\\n }\\n }\\n for (var i in n) {\\n if (-1 === seenKeys.indexOf(i)) {\\n d.push(\\\"Added: \\\"+p+i)\\n }\\n }\\n return d\\n }\\n\\n // if the doc is an {error:\\\"blerg\\\"}, then throw that right out.\\n // something detected in the _updates/package script.\\n // XXX: Make this not ever happen ever. Validation belongs here,\\n // not in the update function.\\n assert(!doc.forbidden || doc._deleted, doc.forbidden)\\n\\n // everyone may alter his \\\"starred\\\" status on any package\\n if (oldDoc &&\\n !doc._deleted &&\\n deepEquals(doc, oldDoc,\\n [[\\\"users\\\", user.name], [\\\"time\\\", \\\"modified\\\"]])) {\\n return\\n }\\n\\n\\n // check if the user is allowed to write to this package.\\n function validUser () {\\n if ( !oldDoc || !oldDoc.maintainers ) return true\\n if (isAdmin()) return true\\n if (typeof oldDoc.maintainers !== \\\"object\\\") return true\\n for (var i = 0, l = oldDoc.maintainers.length; i < l; i ++) {\\n if (oldDoc.maintainers[i].name === user.name) return true\\n }\\n return false\\n }\\n\\n function isAdmin () {\\n if (dbCtx &&\\n dbCtx.admins) {\\n if (dbCtx.admins.names &&\\n dbCtx.admins.roles &&\\n dbCtx.admins.names.indexOf(user.name) !== -1) return true\\n for (var i=0;i<user.roles.length;i++) {\\n if (dbCtx.admins.roles.indexOf(user.roles[i]) !== -1) return true\\n }\\n }\\n return user.roles.indexOf(\\\"_admin\\\") >= 0\\n }\\n\\n var vu = validUser()\\n if (!vu) {\\n assert(vu, \\\"user: \\\" + user.name + \\\" not authorized to modify \\\"\\n + doc.name + \\\"\\\\n\\\"\\n + diffObj(oldDoc, doc).join(\\\"\\\\n\\\"))\\n }\\n\\n // deleting a document entirely *is* allowed.\\n if (doc._deleted) return\\n\\n // sanity checks.\\n assert(valid.name(doc.name), \\\"name invalid: \\\"+doc.name)\\n\\n // New documents may only be created with all lowercase names.\\n // At some point, existing docs will be migrated to lowercase names\\n // as well.\\n if (!oldDoc && doc.name !== doc.name.toLowerCase()) {\\n assert(false, \\\"New packages must have all-lowercase names\\\")\\n }\\n\\n assert(doc.name === doc._id, \\\"name must match _id\\\")\\n assert(!doc.mtime, \\\"doc.mtime is deprecated\\\")\\n assert(!doc.ctime, \\\"doc.ctime is deprecated\\\")\\n assert(typeof doc.time === \\\"object\\\", \\\"time must be object\\\")\\n\\n assert(typeof doc[\\\"dist-tags\\\"] === \\\"object\\\", \\\"dist-tags must be object\\\")\\n\\n var versions = doc.versions\\n assert(typeof versions === \\\"object\\\", \\\"versions must be object\\\")\\n\\n var latest = doc[\\\"dist-tags\\\"].latest\\n if (latest) {\\n assert(versions[latest], \\\"dist-tags.latest must be valid version\\\")\\n }\\n\\n for (var v in doc[\\\"dist-tags\\\"]) {\\n var ver = doc[\\\"dist-tags\\\"][v]\\n assert(semver.valid(ver),\\n v + \\\" version invalid version: \\\" + ver)\\n assert(versions[ver],\\n v + \\\" version missing: \\\" + ver)\\n }\\n\\n for (var ver in versions) {\\n var version = versions[ver]\\n assert(semver.valid(ver),\\n \\\"invalid version: \\\" + ver)\\n assert(typeof version === \\\"object\\\",\\n \\\"version entries must be objects\\\")\\n assert(version.version === ver,\\n \\\"version must match: \\\"+ver)\\n assert(version.name === doc._id,\\n \\\"version \\\"+ver+\\\" has incorrect name: \\\"+version.name)\\n }\\n\\n assert(Array.isArray(doc.maintainers),\\n \\\"maintainers should be a list of owners\\\")\\n doc.maintainers.forEach(function (m) {\\n assert(m.name && m.email,\\n \\\"Maintainer should have name and email: \\\" + JSON.stringify(m))\\n })\\n\\n var time = doc.time\\n var c = new Date(Date.parse(time.created))\\n , m = new Date(Date.parse(time.modified))\\n assert(c.toString() !== \\\"Invalid Date\\\",\\n \\\"invalid created time: \\\" + JSON.stringify(time.created))\\n\\n assert(m.toString() !== \\\"Invalid Date\\\",\\n \\\"invalid modified time: \\\" + JSON.stringify(time.modified))\\n\\n if (oldDoc &&\\n oldDoc.time &&\\n oldDoc.time.created &&\\n Date.parse(oldDoc.time.created)) {\\n assert(Date.parse(oldDoc.time.created) === Date.parse(time.created),\\n \\\"created time cannot be changed\\\")\\n }\\n\\n if (oldDoc && oldDoc.users) {\\n assert(deepEquals(doc.users,\\n oldDoc.users, [[user.name]]),\\n \\\"you may only alter your own 'star' setting\\\")\\n }\\n\\n if (doc.url) {\\n assert(false,\\n \\\"Package redirection has been removed. \\\"+\\n \\\"Please update your publish scripts.\\\")\\n }\\n\\n\\n // at this point, we've passed the basic sanity tests.\\n // Time to dig into more details.\\n // Valid operations:\\n // 1. Add a version\\n // 2. Remove a version\\n // 3. Modify a version\\n // 4. Add or remove onesself from the \\\"users\\\" hash (already done)\\n //\\n // If a version is being added or changed, make sure that the\\n // _npmUser field matches the current user, and that the\\n // time object has the proper entry, and that the \\\"maintainers\\\"\\n // matches the current \\\"maintainers\\\" field.\\n //\\n // Things that must not change:\\n //\\n // 1. More than one version being modified.\\n // 2. Removing keys from the \\\"time\\\" hash\\n //\\n // Later, once we are off of the update function 3-stage approach,\\n // these things should also be errors:\\n //\\n // 1. Lacking an attachment for any published version.\\n // 2. Having an attachment for any version not published.\\n\\n var oldVersions = oldDoc ? oldDoc.versions || {} : {}\\n var oldTime = oldDoc ? oldDoc.time || {} : {}\\n\\n var versions = Object.keys(doc.versions)\\n , modified = null\\n\\n for (var i = 0, l = versions.length; i < l; i ++) {\\n var v = versions[i]\\n if (!v) continue\\n assert(doc.time[v], \\\"must have time entry for \\\"+v)\\n\\n if (!deepEquals(doc.versions[v], oldVersions[v], [[\\\"directories\\\"], [\\\"deprecated\\\"]]) &&\\n doc.versions[v]) {\\n // this one was modified\\n // if it's more than a few minutes off, then something is wrong.\\n var t = Date.parse(doc.time[v])\\n , n = Date.now()\\n // assert(doc.time[v] !== oldTime[v] &&\\n // Math.abs(n - t) < 1000 * 60 * 60,\\n // v + \\\" time needs to be updated\\\\n\\\" +\\n // \\\"new=\\\" + JSON.stringify(doc.versions[v]) + \\\"\\\\n\\\" +\\n // \\\"old=\\\" + JSON.stringify(oldVersions[v]))\\n\\n // var mt = Date.parse(doc.time.modified).getTime()\\n // , vt = t.getTime()\\n // assert(Math.abs(mt - vt) < 1000 * 60 * 60,\\n // v + \\\" is modified, should match modified time\\\")\\n\\n // XXX Remove the guard these once old docs have been found and\\n // fixed. It's too big of a pain to have to manually fix\\n // each one every time someone complains.\\n if (typeof doc.versions[v]._npmUser !== \\\"object\\\") continue\\n\\n\\n assert(typeof doc.versions[v]._npmUser === \\\"object\\\",\\n \\\"_npmUser field must be object\\\\n\\\"+\\n \\\"(You probably need to upgrade your npm version)\\\")\\n assert(doc.versions[v]._npmUser.name === user.name,\\n \\\"_npmUser.name must === user.name\\\")\\n assert(deepEquals(doc.versions[v].maintainers,\\n doc.maintainers),\\n \\\"modified version 'maintainers' must === doc.maintainers\\\")\\n\\n // make sure that the _npmUser is one of the maintainers\\n var found = false\\n for (var j = 0, lm = doc.maintainers.length; j < lm; j ++) {\\n var m = doc.maintainers[j]\\n if (m.name === doc.versions[v]._npmUser.name) {\\n found = true\\n break\\n }\\n }\\n assert(found, \\\"_npmUser must be a current maintainer.\\\\n\\\"+\\n \\\"maintainers=\\\" + JSON.stringify(doc.maintainers)+\\\"\\\\n\\\"+\\n \\\"current user=\\\" + JSON.stringify(doc.versions[v]._npmUser))\\n\\n } else if (oldTime[v]) {\\n assert(oldTime[v] === doc.time[v],\\n v + \\\" time should not be modified 1\\\")\\n }\\n }\\n\\n // now go through all the time settings that weren't covered\\n for (var v in oldTime) {\\n if (doc.versions[v] || !oldVersions[v]) continue\\n assert(doc.time[v] === oldTime[v],\\n v + \\\" time should not be modified 2\\\")\\n }\\n\\n}\">>},\n {<<\"language\">>,<<\"javascript\">>},\n {<<\"deep\">>,\n <<\"exports.deepEquals = deepEquals\\nexports.extend = deepExtend\\nfunction deepExtend(o1, o2) {\\n // extend o1 with o2 (in-place)\\n for (var prop in o2) {\\n if (hOP(o2, prop)) {\\n if (hOP(o1, prop)) {\\n if (typeof o1[prop] === \\\"object\\\") {\\n deepExtend(o1[prop], o2[prop])\\n }\\n } else {\\n o1[prop] = o2[prop]\\n }\\n }\\n }\\n return o1\\n }\\nfunction fullPath(pathPrefix, p){\\n return pathPrefix.concat([p])\\n }\\nfunction isObject(v){\\n return typeof v === 'object'\\n }\\nfunction arrayInArray(v, arr) {\\n // Check whether `arr` contains an array that's shallowly equal to `v`.\\n return arr.some(function(e) {\\n if (e.length !== v.length) return false\\n for (var i=0; i<e.length; i++) {\\n if (e[i] !== v[i]) {\\n return false\\n }\\n }\\n return true\\n })\\n }\\nfunction deepEquals(o1, o2, ignoreKeys, pathPrefix){\\n pathPrefix = pathPrefix || []\\n ignoreKeys = ignoreKeys || []\\n function hOP (obj, prop) {\\n return Object.prototype.hasOwnProperty.call(obj, prop)\\n }\\n if (typeof o1 !== typeof o2) {\\n return false\\n } else if (!isObject(o1)) {\\n return o1 === o2\\n }\\n for (var prop in o1) {\\n if (hOP(o1, prop) &&\\n !arrayInArray(fullPath(pathPrefix, prop), ignoreKeys)) {\\n if (!hOP(o2, prop) ||\\n !deepEquals(o1[prop],\\n o2[prop],\\n ignoreKeys,\\n fullPath(pathPrefix, prop))) {\\n return false\\n }\\n }\\n }\\n for (var prop in o2) {\\n if (hOP(o2, prop) &&\\n !hOP(o1, prop) &&\\n !arrayInArray(fullPath(pathPrefix, prop), ignoreKeys)) {\\n return false\\n }\\n }\\n return true\\n }\">>},\n {<<\"semver\">>,\n <<\"var expr = exports.expression = /^\\\\s*\\\\s*[v=]*\\\\s*([0-9]+)\\\\.([0-9]+)\\\\.([0-9]+)(-[0-9]+-?)?([a-zA-Z-][a-zA-Z0-9-.:]*)?\\\\s*$/\\nexports.valid = valid\\nexports.clean = clean\\nfunction valid(v) {\\n return v && typeof v === \\\"string\\\" && v.match(expr)\\n }\\nfunction clean(v) {\\n v = valid(v)\\n if (!v) return v\\n return [ v[1]||'0',\\n v[2]||'0',\\n v[3]||'0' ].join('.') +\\n (v[4]||'') +\\n (v[5]||'')\\n }\">>},\n {<<\"valid\">>,\n <<\"var semver = require(\\\"semver\\\")\\nexports.name = validName\\nexports.package = validPackage\\nfunction validName(name) {\\n if (!name) return false\\n var n = name.trim()\\n if (!n || n.charAt(0) === \\\".\\\"\\n || n.match(/[\\\\/\\\\(\\\\)&\\\\?#\\\\|<>@:%\\\\s\\\\\\\\]/)\\n || n.toLowerCase() === \\\"node_modules\\\"\\n || n.toLowerCase() === \\\"favicon.ico\\\") {\\n return false\\n }\\n return n\\n }\\nfunction validPackage(pkg) {\\n return validName(pkg.name) && semver.valid(pkg.version)\\n }\">>},\n {<<\"Date\">>,\n <<\"exports.parse = parse\\nexports.toISOString = toISOString\\nexports.now = now\\nfunction now() {\\n return new Date().getTime()\\n }\\nfunction parse(s) {\\n // s is something like \\\"2010-12-29T07:31:06Z\\\"\\n s = s.split(\\\"T\\\")\\n var ds = s[0]\\n , ts = s[1]\\n , d = new Date()\\n ds = ds.split(\\\"-\\\")\\n ts = ts.split(\\\":\\\")\\n var tz = ts[2].substr(2)\\n ts[2] = ts[2].substr(0, 2)\\n d.setUTCFullYear(+ds[0])\\n d.setUTCMonth(+ds[1]-1)\\n d.setUTCDate(+ds[2])\\n d.setUTCHours(+ts[0])\\n d.setUTCMinutes(+ts[1])\\n d.setUTCSeconds(+ts[2])\\n d.setUTCMilliseconds(0)\\n return d.getTime()\\n }\\nexports.toISOString = toISOString\\nfunction toISOString() { return ISODateString(this) }\\nfunction pad(n){return n<10 ? '0'+n : n}\\nfunction ISODateString(d){\\n return d.getUTCFullYear()+'-'\\n + pad(d.getUTCMonth()+1)+'-'\\n + pad(d.getUTCDate())+'T'\\n + pad(d.getUTCHours())+':'\\n + pad(d.getUTCMinutes())+':'\\n + pad(d.getUTCSeconds())+'Z'}\">>},\n {<<\"Object\">>,\n <<\"exports.keys = keys\\nfunction keys(o) {\\n var a = []\\n for (var i in o) a.push(i)\\n return a }\">>},\n {<<\"Array\">>,\n <<\"exports.isArray = isArray\\nexports.forEach = forEach\\n\\nexports.reduce = reduce\\n\\nfunction forEach(fn) {\\n for (var i = 0, l = this.length; i < l; i ++) {\\n if (this.hasOwnProperty(i)) {\\n fn(this[i], i, this)\\n }\\n }\\n }\\nfunction reduce(callback, initialValue) {\\n var previousValue = initialValue || this[0];\\n for (var i = initialValue ? 0 : 1; i < this.length; i++) {\\n previousValue = callback(previousValue, this[i], i, this);\\n }\\n return previousValue;\\n }\\nfunction isArray(a) {\\n return a instanceof Array\\n || Object.prototype.toString.call(a) === \\\"[object Array]\\\"\\n || (typeof a === \\\"object\\\" && typeof a.length === \\\"number\\\") }\">>},\n {<<\"String\">>,\n <<\"exports.trim = trim\\nfunction trim() {\\n return this.replace(/^\\\\s+|\\\\s+$/g, \\\"\\\")\\n }\">>},\n {<<\"monkeypatch\">>,\n <<\"exports.patch = patch\\nfunction patch(Object, Date, Array, String) {\\n if (!Date.parse || isNaN(Date.parse(\\\"2010-12-29T07:31:06Z\\\"))) {\\n Date.parse = require(\\\"Date\\\").parse\\n }\\n\\n Date.prototype.toISOString = Date.prototype.toISOString\\n || require(\\\"Date\\\").toISOString\\n\\n Date.now = Date.now\\n || require(\\\"Date\\\").now\\n\\n Object.keys = Object.keys\\n || require(\\\"Object\\\").keys\\n\\n Array.prototype.forEach = Array.prototype.forEach\\n || require(\\\"Array\\\").forEach\\n\\n Array.prototype.reduce = Array.prototype.reduce\\n || require(\\\"Array\\\").reduce\\n\\n Array.isArray = Array.isArray\\n || require(\\\"Array\\\").isArray\\n\\n String.prototype.trim = String.prototype.trim\\n || require(\\\"String\\\").trim\\n }\">>},\n {<<\"attachments_md5\">>,{[]}}]}]},\n infinity]}}","reason":"{gen_server,call,\n [couch_query_servers,\n {get_proc,{doc,<<\"_design/scratch\">>,\n {1,\n [<<68,46,179,61,93,19,207,20,176,112,187,160,68,\n 169,118,77>>]},\n {[{<<\"shows\">>,\n {[{<<\"package\">>,\n <<\"function (doc, req) {\\n require(\\\"monkeypatch\\\").patch(Object, Date, Array, String)\\n\\n var semver = require(\\\"semver\\\")\\n , code = 200\\n , headers = {\\\"Content-Type\\\":\\\"application/json\\\"}\\n , body = null\\n\\n delete doc.ctime\\n delete doc.mtime\\n if (doc.versions) Object.keys(doc.versions).forEach(function (v) {\\n delete doc.versions[v].ctime\\n delete doc.versions[v].mtime\\n })\\n\\n // legacy kludge\\n if (doc.versions) for (var v in doc.versions) {\\n var clean = semver.clean(v)\\n doc.versions[v].directories = doc.versions[v].directories || {}\\n if (clean !== v) {\\n var p = doc.versions[v]\\n delete doc.versions[v]\\n p.version = v = clean\\n doc.versions[clean] = p\\n }\\n if (doc.versions[v].dist.tarball) {\\n\\n // make it point at THIS registry that is being requested,\\n // with the full /db/_design/app/_rewrite if that is being used,\\n // or just the /name if not.\\n\\n var t = doc.versions[v].dist.tarball\\n t = t.replace(/^https?:\\\\/\\\\/[^\\\\/:]+(:[0-9]+)?/, '')\\n\\n var requestedPath = req.requested_path\\n // workaround for old couch versions that didn't\\n // have requested_path\\n if (requestedPath && -1 === requestedPath.indexOf('show'))\\n requestedPath = requestedPath.slice(0)\\n else {\\n var path = req.path\\n if (path) {\\n var i = path.indexOf('_show')\\n if (i !== -1) {\\n requestedPath = path.slice(0)\\n requestedPath.splice(i, i + 2, '_rewrite')\\n }\\n } else return {\\n code : 500,\\n body : JSON.stringify({error: 'bad couch'}),\\n headers : headers\\n }\\n }\\n\\n // doc.versions[v].dist._origTarball = doc.versions[v].dist.tarball\\n // doc.versions[v].dist._headers = req.headers\\n // doc.versions[v].dist._query = req.query\\n // doc.versions[v].dist._reqPath = req.requested_path\\n // doc.versions[v].dist._path = req.path\\n // doc.versions[v].dist._t = t.slice(0)\\n\\n // actual location of tarball should always be:\\n // .../_rewrite/pkg/-/pkg-version.tgz\\n // or: /pkg/-/pkg-version.tgz\\n // depending on what requested path is.\\n var tf = [doc.name, '-', t.split('/').pop()]\\n var i = requestedPath.indexOf('_rewrite')\\n if (i !== -1) {\\n tf = requestedPath.slice(0, i + 1).concat(tf)\\n }\\n t = '/' + tf.join('/')\\n var h = \\\"http://\\\" + req.headers.Host\\n\\n doc.versions[v].dist.tarball = h + t\\n }\\n }\\n if (doc[\\\"dist-tags\\\"]) for (var tag in doc[\\\"dist-tags\\\"]) {\\n var clean = semver.clean(doc[\\\"dist-tags\\\"][tag])\\n if (!clean) delete doc[\\\"dist-tags\\\"][tag]\\n else doc[\\\"dist-tags\\\"][tag] = clean\\n }\\n // end kludge\\n\\n if (req.query.version) {\\n var ver = req.query.version\\n // if not a valid version, then treat as a tag.\\n if ((!(ver in doc.versions) && (ver in doc[\\\"dist-tags\\\"]))\\n || !semver.valid(ver)) {\\n ver = doc[\\\"dist-tags\\\"][ver]\\n }\\n body = doc.versions[ver]\\n if (!body) {\\n code = 404\\n body = {\\\"error\\\" : \\\"version not found: \\\"+req.query.version}\\n }\\n } else {\\n body = doc\\n for (var i in body) if (i.charAt(0) === \\\"_\\\" && i !== \\\"_id\\\" && i !== \\\"_rev\\\") {\\n delete body[i]\\n }\\n for (var i in body.time) {\\n if (!body.versions[i]) delete body.time[i]\\n else body.time[i] = new Date(Date.parse(body.time[i])).toISOString()\\n }\\n }\\n\\n body = req.query.jsonp\\n ? req.query.jsonp + \\\"(\\\" + JSON.stringify(body) + \\\")\\\"\\n : toJSON(body)\\n\\n return {\\n code : code,\\n body : body,\\n headers : headers\\n }\\n}\">>}]}},\n {<<\"updates\">>,\n {[{<<\"package\">>,\n <<\"function (doc, req) {\\n require(\\\"monkeypatch\\\").patch(Object, Date, Array, String)\\n\\n var semver = require(\\\"semver\\\")\\n var valid = require(\\\"valid\\\")\\n function error (reason) {\\n return [{_id: \\\"error: forbidden\\\", forbidden:reason}, JSON.stringify({forbidden:reason})]\\n }\\n\\n function ok (doc, message) {\\n delete doc.mtime\\n delete doc.ctime\\n var time = doc.time = doc.time || {}\\n time.modified = (new Date()).toISOString()\\n time.created = time.created || time.modified\\n for (var v in doc.versions) {\\n var ver = doc.versions[v]\\n delete ver.ctime\\n delete ver.mtime\\n time[v] = time[v] || (new Date()).toISOString()\\n }\\n return [doc, JSON.stringify({ok:message})]\\n }\\n\\n if (doc) {\\n if (req.query.version) {\\n var parsed = semver.valid(req.query.version)\\n if (!parsed) {\\n // it's a tag.\\n var tag = req.query.version\\n , ver = JSON.parse(req.body)\\n if (!semver.valid(ver)) {\\n return error(\\\"setting tag \\\"+tag+\\\" to invalid version: \\\"+req.body)\\n }\\n doc[\\\"dist-tags\\\"][tag] = semver.clean(ver)\\n return ok(doc, \\\"updated tag\\\")\\n }\\n // adding a new version.\\n var ver = req.query.version\\n if (!semver.valid(ver)) {\\n return error(\\\"invalid version: \\\"+ver)\\n }\\n\\n if ((ver in doc.versions) || (semver.clean(ver) in doc.versions)) {\\n // attempting to overwrite an existing version.\\n // not supported at this time.\\n if (!req.query.rev || req.query.rev !== doc._rev) {\\n return error(\\\"cannot modify existing version\\\")\\n }\\n }\\n\\n var body = JSON.parse(req.body)\\n if (!valid.name(body.name)) {\\n return error( \\\"Invalid name: \\\"+JSON.stringify(body.name))\\n }\\n body.version = semver.clean(body.version)\\n ver = semver.clean(ver)\\n if (body.version !== ver) {\\n return error( \\\"version in doc doesn't match version in request: \\\"\\n + JSON.stringify(body.version)\\n + \\\" !== \\\" + JSON.stringify(ver) )\\n }\\n body._id = body.name + \\\"@\\\" + body.version\\n if (body.description) doc.description = body.description\\n if (body.author) doc.author = body.author\\n if (body.repository) doc.repository = body.repository\\n body.maintainers = doc.maintainers\\n\\n var tag = req.query.tag\\n || (body.publishConfig && body.publishConfig.tag)\\n || body.tag\\n || \\\"latest\\\"\\n\\n if (!req.query.pre) doc[\\\"dist-tags\\\"][tag] = body.version\\n doc.versions[ver] = body\\n doc.time = doc.time || {}\\n doc.time[ver] = (new Date()).toISOString()\\n return ok(doc, \\\"added version\\\")\\n }\\n\\n // update the package info\\n var newdoc = JSON.parse(req.body)\\n , changed = false\\n if (doc._rev && doc._rev !== newdoc._rev) {\\n return error( \\\"must supply latest _rev to update existing package\\\" )\\n }\\n for (var i in newdoc) if (typeof newdoc[i] === \\\"string\\\" || i === \\\"maintainers\\\") {\\n doc[i] = newdoc[i]\\n }\\n if (newdoc.versions) {\\n doc.versions = newdoc.versions\\n }\\n if (newdoc[\\\"dist-tags\\\"]) {\\n doc[\\\"dist-tags\\\"] = newdoc[\\\"dist-tags\\\"]\\n }\\n if (newdoc.users) {\\n if (!doc.users) doc.users = {}\\n doc.users[req.userCtx.name] = newdoc.users[req.userCtx.name]\\n }\\n return ok(doc, \\\"updated package metadata\\\")\\n } else {\\n // Create new package doc\\n doc = JSON.parse(req.body)\\n if (!doc._id) doc._id = doc.name\\n if (!doc.versions) doc.versions = {}\\n var latest\\n for (var v in doc.versions) {\\n if (!semver.valid(v)) return error(\\\"Invalid version: \\\"+JSON.stringify(v))\\n var p = doc.versions[v]\\n if (p.version !== v) return error(\\\"Version mismatch: \\\"+JSON.stringify(v)\\n +\\\" !== \\\"+JSON.stringify(p.version))\\n if (!valid.name(p.name)) return error(\\\"Invalid name: \\\"+JSON.stringify(p.name))\\n latest = semver.clean(v)\\n }\\n if (!doc['dist-tags']) doc['dist-tags'] = {}\\n if (latest) doc[\\\"dist-tags\\\"].latest = latest\\n return ok(doc, \\\"created new entry\\\")\\n }\\n}\">>}]}},\n {<<\"rewrites\">>,\n [{[{<<\"from\">>,<<\"/\">>},\n {<<\"to\">>,<<\"../../../registry\">>},\n {<<\"method\">>,<<\"GET\">>}]},\n {[{<<\"from\">>,<<\"/-/jsonp/:jsonp\">>},\n {<<\"to\">>,<<\"_list/short/listAll\">>},\n {<<\"method\">>,<<\"GET\">>}]},\n {[{<<\"from\">>,<<\"/_session\">>},\n {<<\"to\">>,<<\"../../../_session\">>},\n {<<\"method\">>,<<\"GET\">>}]},\n {[{<<\"from\">>,<<\"/_session\">>},\n {<<\"to\">>,<<\"../../../_session\">>},\n {<<\"method\">>,<<\"PUT\">>}]},\n {[{<<\"from\">>,<<\"/_session\">>},\n {<<\"to\">>,<<\"../../../_session\">>},\n {<<\"method\">>,<<\"POST\">>}]},\n {[{<<\"from\">>,<<\"/_session\">>},\n {<<\"to\">>,<<\"../../../_session\">>},\n {<<\"method\">>,<<\"DELETE\">>}]},\n {[{<<\"from\">>,<<\"/_session\">>},\n {<<\"to\">>,<<\"../../../_session\">>},\n {<<\"method\">>,<<\"HEAD\">>}]},\n {[{<<\"from\">>,<<\"/-/all/since\">>},\n {<<\"to\">>,<<\"_list/index/modified\">>},\n {<<\"method\">>,<<\"GET\">>}]},\n {[{<<\"from\">>,<<\"/-/rss\">>},\n {<<\"to\">>,<<\"_list/rss/modified\">>},\n {<<\"method\">>,<<\"GET\">>}]},\n {[{<<\"from\">>,<<\"/-/all\">>},\n {<<\"to\">>,<<\"_list/index/listAll\">>},\n {<<\"method\">>,<<\"GET\">>}]},\n {[{<<\"from\">>,<<\"/-/all/-/jsonp/:jsonp\">>},\n {<<\"to\">>,<<\"_list/index/listAll\">>},\n {<<\"method\">>,<<\"GET\">>}]},\n {[{<<\"from\">>,<<\"/-/short\">>},\n {<<\"to\">>,<<\"_list/short/listAll\">>},\n {<<\"method\">>,<<\"GET\">>}]},\n {[{<<\"from\">>,<<\"/-/scripts\">>},\n {<<\"to\">>,<<\"_list/scripts/scripts\">>},\n {<<\"method\">>,<<\"GET\">>}]},\n {[{<<\"from\">>,<<\"/-/by-field\">>},\n {<<\"to\">>,<<\"_list/byField/byField\">>},\n {<<\"method\">>,<<\"GET\">>}]},\n {[{<<\"from\">>,<<\"/-/fields\">>},\n {<<\"to\">>,<<\"_list/sortCount/fieldsInUse\">>},\n {<<\"method\">>,<<\"GET\">>},\n {<<\"query\">>,{[{<<\"group\">>,<<\"true\">>}]}}]},\n {[{<<\"from\">>,<<\"/-/needbuild\">>},\n {<<\"to\">>,<<\"_list/needBuild/needBuild\">>},\n {<<\"method\">>,<<\"GET\">>}]},\n {[{<<\"from\">>,<<\"/-/prebuilt\">>},\n {<<\"to\">>,<<\"_list/preBuilt/needBuild\">>},\n {<<\"method\">>,<<\"GET\">>}]},\n {[{<<\"from\">>,<<\"/-/nonlocal\">>},\n {<<\"to\">>,<<\"_list/short/nonlocal\">>},\n {<<\"method\">>,<<\"GET\">>}]},\n {[{<<\"from\">>,<<\"/favicon.ico\">>},\n {<<\"to\">>,<<\"../../npm/favicon.ico\">>},\n {<<\"method\">>,<<\"GET\">>}]},\n {[{<<\"from\">>,<<\"/-/users\">>},\n {<<\"to\">>,\n <<\"../../../_users/_design/_auth/_list/index/listAll\">>},\n {<<\"method\">>,<<\"GET\">>}]},\n {[{<<\"from\">>,<<\"/-/user/:user\">>},\n {<<\"to\">>,<<\"../../../_users/:user\">>},\n {<<\"method\">>,<<\"PUT\">>}]},\n {[{<<\"from\">>,<<\"/-/user/:user/-rev/:rev\">>},\n {<<\"to\">>,<<\"../../../_users/:user\">>},\n {<<\"method\">>,<<\"PUT\">>}]},\n {[{<<\"from\">>,<<\"/-/user/:user\">>},\n {<<\"to\">>,<<\"../../../_users/:user\">>},\n {<<\"method\">>,<<\"GET\">>}]},\n {[{<<\"from\">>,<<\"/_users/:user\">>},\n {<<\"to\">>,<<\"../../../_users/:user\">>},\n {<<\"method\">>,<<\"PUT\">>}]},\n {[{<<\"from\">>,<<\"/_users/:user\">>},\n {<<\"to\">>,<<\"../../../_users/:user\">>},\n {<<\"method\">>,<<\"GET\">>}]},\n {[{<<\"from\">>,<<\"/public_users/:user\">>},\n {<<\"to\">>,<<\"../../../public_users/:user\">>},\n {<<\"method\">>,<<\"PUT\">>}]},\n {[{<<\"from\">>,<<\"/public_users/:user\">>},\n {<<\"to\">>,<<\"../../../public_users/:user\">>},\n {<<\"method\">>,<<\"GET\">>}]},\n {[{<<\"from\">>,<<\"/-/user-by-email/:email\">>},\n {<<\"to\">>,\n <<\"../../../_users/_design/_auth/_list/email/listAll\">>},\n {<<\"method\">>,<<\"GET\">>}]},\n {[{<<\"from\">>,<<\"/-/top\">>},\n {<<\"to\">>,<<\"_view/npmTop\">>},\n