| var couchapp = require('couchapp') |
| , path = require('path') |
| |
| |
| ddoc = |
| { _id:'_design/ui' |
| , rewrites : |
| [ {from:"/", to:'index.html'} |
| , {from:"/favicon.ico", to:'../../npm/favicon.ico'} |
| , {from:"/api", to:'../../'} |
| , {from:"/api/*", to:'../../*'} |
| , {from: "/downloads/*", to: '../../../downloads/*'} |
| , {from:"/*", to:'*'} |
| ] |
| , lists : {} |
| } |
| |
| function searcher(doc) { |
| |
| //if(word) ? id = word : id=doc._id; |
| |
| if (doc['dist-tags'] && doc['dist-tags'].latest) { |
| var dist = doc.versions[doc['dist-tags'].latest]; |
| //We have latest version, now get the platforms available. |
| var version = doc['dist-tags'].latest; |
| var engines = dist && dist.engines ? dist.engines : ''; |
| var platforms = dist && dist.platforms ? dist.platforms : ''; |
| var obj = { |
| name: doc.name |
| , description: doc.description |
| , version: version |
| , platforms: platforms |
| , engines: engines |
| }; |
| emit(doc._id, obj); |
| } |
| } |
| |
| function packageSearch (doc) { |
| var descriptionBlacklist = |
| [ "for" |
| , "and" |
| , "in" |
| , "are" |
| , "is" |
| , "it" |
| , "do" |
| , "of" |
| , "on" |
| , "the" |
| , "to" |
| , "as" |
| ] |
| |
| if (doc['dist-tags'] && doc['dist-tags'].latest) { |
| var dist = doc.versions[doc['dist-tags'].latest]; |
| //We have latest version, now get the platforms available. |
| var version = doc['dist-tags'].latest; |
| var engines = dist && dist.engines ? dist.engines : ''; |
| var platforms = dist && dist.platforms ? dist.platforms : ''; |
| var obj = { |
| name: doc.name |
| , description: doc.description |
| , version: version |
| , platforms: platforms |
| , engines: engines |
| }; |
| } |
| |
| if (doc.name) { // There aren't any better attributes for check if isPackage() |
| if (doc.name) { |
| var names = [doc.name]; |
| if (doc.name.indexOf('-') !== -1) doc.name.split('-').forEach(function (n) {names.push(n)}); |
| if (doc.name.indexOf('_') !== -1) doc.name.split('_').forEach(function (n) {names.push(n)}); |
| names.forEach(function (n) { |
| if (n.length > 1) emit(n.toLowerCase(), obj); |
| }); |
| } |
| if (doc._id) { |
| var ids = [doc._id]; |
| if (doc._id.indexOf('.') !== -1) doc._id.split('.').forEach(function (n) {ids.push(n)}); |
| ids.forEach(function (id) { |
| if (id.length > 1) emit(id.toLowerCase(), obj); |
| }); |
| } |
| |
| if (doc['dist-tags'] && doc['dist-tags'].latest && ( |
| doc.versions[doc['dist-tags'].latest].keywords)) { |
| var keywords = (doc.versions[doc['dist-tags'].latest].keywords) |
| keywords.forEach(function (keyword) { |
| keyword.split(' ').forEach(function (k) { |
| if (k.length > 0) emit(k.toLowerCase(), obj); |
| }); |
| }) |
| } |
| |
| if (doc.description) { |
| doc.description.split(' ').forEach(function (d) { |
| d = d.toLowerCase(); |
| while (d.indexOf('.') !== -1) d = d.replace('.', ''); |
| while (d.indexOf('\n') !== -1) d = d.replace('\n', ''); |
| while (d.indexOf('\r') !== -1) d = d.replace('\r', ''); |
| while (d.indexOf('`') !== -1) d = d.replace('`', ''); |
| while (d.indexOf('_') !== -1) d = d.replace('_', ''); |
| while (d.indexOf('"') !== -1) d = d.replace('"', ''); |
| while (d.indexOf('\'') !== -1) d = d.replace('\'', ''); |
| while (d.indexOf('(') !== -1) d = d.replace('(', ''); |
| while (d.indexOf(')') !== -1) d = d.replace(')', ''); |
| while (d.indexOf('[') !== -1) d = d.replace('[', ''); |
| while (d.indexOf(']') !== -1) d = d.replace(']', ''); |
| while (d.indexOf('{') !== -1) d = d.replace('{', ''); |
| while (d.indexOf('}') !== -1) d = d.replace('}', ''); |
| while (d.indexOf('*') !== -1) d = d.replace('*', ''); |
| while (d.indexOf('%') !== -1) d = d.replace('%', ''); |
| while (d.indexOf('+') !== -1) d = d.replace('+', ''); |
| if (descriptionBlacklist.indexOf(d) !== -1) d = ''; |
| if (d.length > 1) emit(d, obj); |
| }) |
| } |
| } |
| } |
| |
| function dependencies (doc) { |
| if (doc['dist-tags'] && doc['dist-tags'].latest) { |
| var dist = doc.versions[doc['dist-tags'].latest]; |
| for (i in dist.dependencies) { |
| emit(i, dist.dependencies[i]) |
| } |
| } |
| } |
| |
| |
| |
| ddoc.views = |
| { search: { map: packageSearch } |
| , searcher: { map: searcher} |
| , dependencies: {map: dependencies, reduce:"_count"} |
| , updated: {map: function (doc) { |
| var l = doc["dist-tags"].latest |
| , t = doc.time && doc.time[l] |
| if (t) emit(t, 1) |
| }} |
| , author: |
| { map: function (doc) { |
| if (doc.author && doc.author.name) { |
| emit(doc.author.name, 1); |
| } |
| } |
| , reduce: "_sum" |
| } |
| , analytics: |
| { map: function (doc) { |
| if (doc.time) { |
| if (doc.time.modified) { |
| emit(['latest', doc.time.modified], 1); |
| } |
| if (doc.time.created) { |
| emit(['created', doc.time.created], 1); |
| } |
| for (i in doc.time) { |
| emit(['update', doc.time[i]], 1); |
| } |
| } |
| } |
| , reduce: "_sum" |
| } |
| } |
| ; |
| |
| ddoc.lists.dependencies_limit = function(head, req) { |
| var deps = []; |
| while(row = getRow()) { |
| deps.push(row); |
| } |
| var sorted = deps.sort(function(a,b) { return req.query.descending !== "true" ? a.value - b.value : b.value - a.value; }); |
| // using list_Limit rather than limit because limit appears to limit the initial view set |
| // assuming there's a supported convention but using this for now |
| var limit = req.query.list_limit && parseInt(req.query.list_limit); |
| send(JSON.stringify({ total_rows: deps.length, rows: limit ? sorted.splice(0, limit) : sorted})); |
| }; |
| |
| ddoc.lists.search = function(head, req) { |
| Object.keys = Object.keys |
| || function (o) { var a = [] |
| for (var i in o) a.push(i) |
| return a } |
| var set = {}; |
| var rows = []; |
| while(row = getRow()) { |
| set[row.id] = { key: row.id, count: set[row.id] ? set[row.id].count + 1 : 1, value: row.value }; |
| } |
| var keys = Object.keys(set); |
| for(var i=0; i<keys.length; i++) { |
| rows.push(set[keys[i]]); |
| } |
| send(JSON.stringify({ rows: rows} )); |
| }; |
| |
| |
| // ddoc.validate_doc_update = function (newDoc, oldDoc, userCtx) { |
| // if (newDoc._deleted === true && userCtx.roles.indexOf('_admin') === -1) { |
| // throw "Only admin can delete documents on this database."; |
| // } |
| // } |
| |
| couchapp.loadAttachments(ddoc, path.join(__dirname, 'attachments')); |
| |
| module.exports = ddoc; |