blob: 37a3639304d259771a9b8a2703030638e201381d [file] [log] [blame]
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;