incubator-couchdb-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Ben Atkin <...@benatkin.com>
Subject ANN: js2json and json2js (for CouchApps)
Date Tue, 04 Sep 2012 09:52:05 GMT
I made a couple of npm (node.js) modules for editing CouchDB design
documents that involves fewer files than python CouchApp, but like
python CouchApp supports two-way sync. The function source is left
intact when converting between JavaScript source and JSON. The
JavaScript source version just shows it in an embedded function
expression, which makes it syntax highlightable.

http://benatkin.com/2012/09/04/js2json-and-json2js/
https://github.com/benatkin/js2json
https://github.com/benatkin/json2js

Here's a quick example. If I stick this in books.js:

module.exports = {
  "views": {
    "author": {
      "map": function(doc) {
        if (doc.type == 'book')
          emit(doc.author, null);
      }
    },
    "title": {
      "map": function(doc) {
        if (doc.type == 'book')
          emit(doc.title, null);
      }
    }
  }
}

...and run this (after npm install json2js js2json):

var js2json = require('js2json');
var json2js = require('json2js');
var fs = require('fs');

var jsSource = fs.readFileSync('books.js', 'utf8');
var jsonValue = js2json.convert(jsSource);
fs.writeFileSync('books.json', JSON.stringify(jsonValue, null, 2) + "\n");
var jsSourceFromJson = json2js.convert(jsonValue);
fs.writeFileSync('books-from-json.js', jsSourceFromJson + "\n");

...I get the following in books.json:

{
  "views": {
    "author": {
      "map": "function(doc) {\n  if (doc.type == 'book')\n
emit(doc.author, null);\n}"
    },
    "title": {
      "map": "function(doc) {\n  if (doc.type == 'book')\n
emit(doc.title, null);\n}"
    }
  }
}

...and books-from-json.js is exactly the same as books.js.

I explain it more in my blog post (linked at the top of this message).
I need to add a cli tool that syncs, a way to handle attachments, and
a way to handle embedded multiline strings for it to be a
full-featured design doc editor. I have much bigger plans for this,
though: I want to break up CouchApps into a bunch of smaller
documents! The source and tests for these two modules is programmed in
the same style. I think storing functions in JSON makes CouchDB just a
little bit like Smalltalk, with a much more familiar language.

Thanks for reading. Feedback welcome and appreciated.

Ben

Mime
View raw message