couchapp

Utilities for building CouchDB applications.

Downloads in past

Stats

StarsIssuesVersionUpdatedCreatedSize
couchapp
0.11.010 years ago13 years agoMinified + gzip package size for couchapp in KB

Readme

Installation
Install node.
Install npm.
$ git clone repo
$ cd node.couchapp.js
$ npm install
$ npm link .

$ couchapp help
couchapp -- utility for creating couchapps
Usage - old style with single app.js: couchapp <command> app.js http://localhost:5984/dbname opts
Usage - new style with multiple app files: directory based config specified by switch - multiple app files and pre- and post-processing capability) couchapp -dc < <appconfigdirectory> http://localhost:5984/dbname
Commands: push : Push app once to server. sync : Push app then watch local files for changes. boiler : Create a boiler project. serve : Serve couchapp from development webserver
you can specify some options
-p port  : list on port portNum [default=3000]
-d dir   : attachments directory [default='attachments']
-l       : log rewrites to couchdb [default='false']

Directory-based config:
-dc (directory config) switch uses multiple config files in the directory specified by <appconfigdirectory>
Any file with a filename that begins with "app" will be executed.
Additionally
(i) if the app config directory contains file beforepushsync.js then this will be executed before any of the app files have run (ii) if the app config directory contains file afterpushsync.js then this will be executed after all of the app files have run
beforepushsync.js and afterpushsync.js can be used to perform any before/after processing, using node.js code for example.
The sample afterpushsync.js shows lookup data being added to CouchDB after the CouchApp has been pushed.

app.js example:
  var couchapp = require('couchapp')
, path = require('path');
ddoc = {
_id: '_design/app'
    , views: {}
    , lists: {}
    , shows: {} 
}
module.exports = ddoc;
ddoc.views.byType = {
map: function(doc) {
  emit(doc.type, null);
},
reduce: '_count'
}
ddoc.views.peopleByName = {
map: function(doc) {
  if(doc.type == 'person') {
    emit(doc.name, null);
  }
}
}
ddoc.lists.people = function(head, req) {
start({
  headers: {"Content-type": "text/html"}
});
send("<ul id='people'>\n");
while(row = getRow()) {
  send("\t<li class='person name'>" + row.key + "</li>\n");
}
send("</ul>\n")
}
ddoc.shows.person = function(doc, req) {
return {
  headers: {"Content-type": "text/html"},
  body: "<h1 id='person' class='name'>" + doc.name + "</h1>\n"
}
}
ddoc.validatedocupdate = function (newDoc, oldDoc, userCtx) {
function require(field, message) {
  message = message || "Document must have a " + field;
  if (!newDoc[field]) throw({forbidden : message});
};

if (newDoc.type == "person") {
  require("name");
}
}
couchapp.loadAttachments(ddoc, path.join(dirname, 'attachments'));

Local development server example.
Start the server:
couchapp serve app.js http://localhost:5984/example_db -p 3000 -l -d attachments
Now you can access your couchapp at http://localhost:3000/ . Code, hack and when you are happy with the result simply do:
couchapp push app.js http://localhost:5984/example_db